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>
AndroidManufest.xmlへの追記は不要と思いますが、それ以外の部分についてはご提示のコードで動作しても良さそうに思えます。上手くいかなかったとは何を以って判断されたのでしょうか。
コメントありがとうございます。ウィジェットをタップして、変数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を変更した場合は反映されました。なので、質問させていただいた箇所の書き方がおかしいのかと思い質問させていただきました。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー