2016-09-26 19 views
1

ViewFlipperでバックアップされたコレクションウィジェットを構築していて、adding behavior to individual itemsのAndroidドキュメントに従うときに不具合に遭遇しました。ViewFlipperウィジェットの個々の要素でクリックリスナーを設定する

私は、このモックアップに示すように、その前と次のビューにViewFlipperを移動する2つの矢印を作成したい:私は次のコードとを持って、私のWidgetService年代getViewAt()方法で

enter image description here

を意図に塗りつぶしを作成します。

final Intent fillInIntent = new Intent(); 
final Bundle bundle = new Bundle(); 
bundle.putInt(WidgetProvider.EXTRA_ID, mWidgetItems.get(position)); 
fillInIntent.putExtras(bundle); 
remoteViews.setOnClickFillInIntent(R.id.btn_widget_next, fillInIntent); 
remoteViews.setOnClickFillInIntent(R.id.btn_widget_previous, fillInIntent); 

そして、私のWidgetProviderに私はこれがあります。

// Adding collection list item handler 
final Intent onItemClick = new Intent(context, WidgetProvider.class); 
onItemClick.setAction(NAVIGATE); 
onItemClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id) 
onItemClick.setData(Uri.parse(onItemClick.toUri(Intent.URI_INTENT_SCHEME))); 
final PendingIntent onClickPendingIntent = PendingIntent 
    .getBroadcast(context, id, onItemClick, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
rv.setPendingIntentTemplate(R.id.widget_view_flipper, onClickPendingIntent); 

ここで私がデザイン上混乱しているのは、ボタンごとにsetOnClickFillInIntentと呼ぶはずです。それぞれのボタンにインテントを設定する場合は、WidgetProvideronUpdateメソッドでクリックされたボタンを特定する方法が必要です(これはすべて、ViewFlipperのビューの位置です)。私は残念なことに複数のアクションに対してクリックリスナーを使用するウィジェットの例を見つけることができませんでした。

+1

はいくつかのフィードバックを与えたいと思った:あなたがにリンクされたテキストは、あなたのRemoteViewsFactoryがcollection.Thisに各アイテムでフィルイン意図を設定する必要があります」と言うすることが可能になります特定のアイテムの個々のオンクリックアクションを区別することができます。だから私はあなたがそのアイテムのようにボタンの塗りつぶしインテント(アイテムの子である)を設定することはできないと思う。 – 0X0nosugar

+0

@ 0X0nosugar見ていただきありがとうございます。あなたがドキュメントの通りだと思われます。私は、しかし、複数のボタンでViewFlipperを使用するウィジェットの例があります。ソースコードにピークが出るのであれば:( –

答えて

1

あなたはにリンクされているドキュメントはで次の文で誤解を招くビット:

あなたRemoteViewsFactoryがcollection.Thisに各アイテムでフィルイン意図を設定する必要がありますが、個々を区別することが可能となりますあなたがしようとするまでにクリック与えられたアイテム

まあの行動、あなたは本当に知っていることはありません:それはフィルイン-テントRemoteViews Iの個々の子どもにを設定するために、すべての後に可能ですテム。しかし、各ボタンに別々のIntentを使用する必要があります。

final Intent fillInIntent = new Intent(); 
final Bundle bundle = new Bundle(); 
bundle.putInt(WidgetProvider.EXTRA_ID, mWidgetItems.get(position)); 
bundle.putBoolean("FLIP_TO_NEXT", true); 
fillInIntent.putExtras(bundle); 
remoteViews.setOnClickFillInIntent(R.id.btn_widget_next, fillInIntent); 

次にあなたがIntentアクション(NAVIGATE)だけでなく、onReceive()intent.getBooleanExtra("FLIP_TO_NEXT", false)の値をチェックし、それに応じてアプリウィジェットを更新する必要があります。私は、NEXT-ボタンの方法を紹介します。例えば「NEXT」をクリックした場合:

ComponentName me = new ComponentName(this, ViewFlipperWidget.class); 
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
int appWidgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
if (appWidgetID != AppWidgetManager.INVALID_APPWIDGET_ID) 
{ 
    RemoteViews rv = new RemoteViews(getPackageName(), R.layout.view_flipper_widget); 
    if (intent.getBooleanExtra("FLIP_TO_NEXT", false)) 
    { 
      rv.showNext(R.id.viewFlipper); 
    } 
    else 
    { 
      rv.showPrevious(R.id.viewFlipper); 
    } 
    appWidgetManager.updateAppWidget(appWidgetID, rv); 
} 
+0

これはすばらしい、ありがとう! –

関連する問題