質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Widget

ホームスクリーンウィジェット、またはAndroidアプリケーションのスクリーン上で使用される一般的なユーザインタフェース要素に関連することを指します。

Q&A

解決済

1回答

662閲覧

android studioで、ActivityからWidgetProviderにデータを送る方法。

noko123

総合スコア28

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Android Widget

ホームスクリーンウィジェット、またはAndroidアプリケーションのスクリーン上で使用される一般的なユーザインタフェース要素に関連することを指します。

0グッド

0クリップ

投稿2020/08/29 08:47

編集2020/08/29 08:50

Activityで入力した数値を、WidgetProviderで扱おうとしています。ネットにあったJavaのコードを参考にして、intentで送ろうとしました。そして受け取った先で初期化しておいたプロパティに代入しようとしましたが上手くいきませんでした。考え方や書き方が間違っていれば指摘してくださると有難いです。よろしくお願いします。

Button.setOnClickListener { if(!editTextNumber.text.isNullOrEmpty()) { val intent = Intent(this, AppWidget::class.java) intent.setAction("CLICK_OK") intent.putExtra("rateOfIncrease", editTextNumber.text.toString().toInt()) applicationContext.sendBroadcast(intent) } }
class AppWidget : AppWidgetProvider() { var rate=0 override fun onReceive(context: Context?, intent: Intent?) { super.onReceive(context, intent) if(intent?.action.equals("CLICK_OK")){ val rateOfIncrease=intent?.getIntExtra("rateOfIncrease",0) if (rateOfIncrease != null) { rate=rateOfIncrease } }
AndroidManufest.xml <receiver android:name=".AppWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="CLICK_WIDGET"/> <action android:name="CLICK_OK"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/app_widget_info" /> </receiver>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keicha_hrs

2020/08/29 14:39

AndroidManufest.xmlへの追記は不要と思いますが、それ以外の部分についてはご提示のコードで動作しても良さそうに思えます。上手くいかなかったとは何を以って判断されたのでしょうか。
noko123

2020/08/29 16:10 編集

コメントありがとうございます。ウィジェットをタップして、変数rateをウィジェットのtextViewに表示させてみようとしました。まず、 internal fun updateAppWidget( context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int ) { val views :RemoteViews=RemoteViews(context.packageName,R.layout.app_widget) val intent = Intent(context,AppWidget::class.java) intent.setAction("CLICK_WIDGET") intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,appWidgetId) val pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT) views.setOnClickPendingIntent(R.id.textView5,pendingIntent) appWidgetManager.updateAppWidget(appWidgetId,views) } とし、それから override fun onReceive(context: Context?, intent: Intent?) { super.onReceive(context, intent) if(intent?.action.equals("CLICK_OK")){ val rateOfIncrease=intent?.getIntExtra("rateOfIncrease",0) if (rateOfIncrease != null) { rate=rateOfIncrease } } if(intent?.action.equals("CLICK_WIDGET")){ val changeWidgetId=intent?.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,0) val views2=RemoteViews(context?.packageName,R.layout.app_widget) views2.setTextViewText(R.id.textView5,rate.toString()) val widgetManager2=AppWidgetManager.getInstance(context) if (changeWidgetId != null) { widgetManager2.updateAppWidget(changeWidgetId,views2) } } } としました。トップレベルで宣言したrateに0以外の数字を直接代入した場合は表示される数も変わったので、タップして表示する部分は出来ているのかなと判断しました。それからif(intent?.action.equals("CLICK_OK"))内で、rateOfIncreaseではなく整数を代入してみても反映されませんでした。しかし、if(intent?.action.equals("CLICK_WIDGET"))内でrateを変更した場合は反映されました。なので、質問させていただいた箇所の書き方がおかしいのかと思い質問させていただきました。 よろしくお願いします。
guest

回答1

0

ベストアンサー

次のページが参考になるのではないでしょうか。

Android AppWidgetProviderのインスタンス調査

私も確認しましたが、インテント受信のたびにAppWidgetProviderのインスタンスが生成されているため、CLICK_OKのときのrateとCLICK_WIDGETのときのrateは別物であり、そのために常に0が表示されてしまうようですね。

このページにあるようにrateの宣言をcompanion objectで囲うか、クラス外に宣言すれば、想定していた動作になるのではないかと思います。

kotlin

1 companion object { 2 var rate = 0 3 }

投稿2020/08/30 08:24

編集2020/08/30 08:55
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noko123

2020/08/30 15:20

ありがとうございます!動作しました! なるほど、そういう理由だったのですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問