My Photo

« 再び、ダメ人間度チェック | Main | 就職活動停止中 »

November 15, 2011

Androidアプリ開発メモ038:AppWidget その4:AppWidgetのボタンの識別

AppWidgetについての以前の記事:
Androidアプリ開発メモ034:AppWidget
Androidアプリ開発メモ035:AppWidget その2
Androidアプリ開発メモ036:AppWidget その3:設定用Activity

AppWidgetの記事というより、IntentまたはPendingIntentの記事かもしれない。

AppWidgetに複数のボタン(例:"Prev"ボタンと"Next"ボタン)があってどのボタンが押されかを識別するにはどうしたらいいか、以下のような方法を考えた。

  • AppWidgetProvider#onUpdate()か設定用Activityで、ボタンにセットするPendingIntentのIntentにputExtra()でボタン固有の情報を埋め込む。
  • ボタンを押して起動されたActivityでgetIntent().getStringExtra()で埋め込んだ情報を取り出し、押されたボタンを識別する。

ボタンを設定するコード。
Intent intent = new Intent(this, com.example.appwidgetexample.AppWidgetExampleConfigure.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(KEY_BUTTON, "Prev");
PendingIntent pendingIntent = PendingIntent.getActivity(this, appWidgetId, intent, 0);
views.setOnClickPendingIntent(R.id.awButton1, pendingIntent);

intent = new Intent(this, com.example.appwidgetexample.AppWidgetExampleConfigure.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(KEY_BUTTON, "Next");
pendingIntent = PendingIntent.getActivity(this, appWidgetId, intent, 0);
views.setOnClickPendingIntent(R.id.awButton2, pendingIntent);

ボタンを識別するコード
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
  String buttonText = extras.getString(KEY_BUTTON);
  if ("Prev".equasl(buttonText)) {
    // Prevボタンの場合のコード
  } else if ("Next".equals(buttonText)) {
    // Nextボタンの場合のコード
  }
}

しかしこれだと思ったような結果にならない。どちらのボタンを押しても extras.getString(key)が"Prev"を返す。
また、ボタンの設定のコードでgetActivity()の第4引数をPendingIntent.FLAG_UPDATE_CURRENTにすると、どちらのボタンを押しても extras.getString(key)が"Next"を返す。
#PendingIntent.FLAG_CANCEL_CURRENTにすると、先に設定したPrevボタンが反応しなくなった。

以下、はっきり言ってよくわからないのだが、上記のボタン設定コードではシステム側にはIntentかPendingIntentが同じものとみなされているようだ。getActivity()の第4引数が0の場合は同じものとみなされて後の設定は無視され、第4引数がFLAG_UPDATE_CURRENTの場合は同じものとみなされて後の設定内容でIntentかPendingIntentが更新されるっぽい。
解決法として、適当な値をsetAction()やsetType()で指定する。そうすると、それぞれのIntentかPendingIntentが違うものとみなされるのか、意図したような動きになる。
#setData()とかsetFlags()でも行けるかもしれないが、確認していない。

Intent intent = new Intent(this, com.example.appwidgetexample.AppWidgetExampleConfigure.class);
intent.setAction("PREV");  // 別なIntent(またはPendingIntent?)とみなされるようにActionをセット
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(KEY_BUTTON, "Prev");  // Action見ればボタンを判定できるから、これいらない
PendingIntent pendingIntent = PendingIntent.getActivity(this, appWidgetId, intent, 0);
views.setOnClickPendingIntent(R.id.awButton1, pendingIntent);

intent = new Intent(this, com.example.appwidgetexample.AppWidgetExampleConfigure.class);
intent.setAction("NEXT");  // 別なIntent(またはPendingIntent?)とみなされるようにActionをセット
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(KEY_BUTTON, "Next");  // Action見ればボタンを判定できるから、これいらない
pendingIntent = PendingIntent.getActivity(this, appWidgetId, intent, 0);
views.setOnClickPendingIntent(R.id.awButton2, pendingIntent);

参考記事:AlarmManagerに異なるintentと認識させる方法 | Android Techfirm Lab

« 再び、ダメ人間度チェック | Main | 就職活動停止中 »

Androidアプリ開発」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/53254694

Listed below are links to weblogs that reference Androidアプリ開発メモ038:AppWidget その4:AppWidgetのボタンの識別:

« 再び、ダメ人間度チェック | Main | 就職活動停止中 »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof