2016-09-26 68 views
1

我正在構建一個支持ViewFlipper的集合小部件,並且在遵循adding behavior to individual items上的Android文檔時遇到了障礙。在ViewFlipper小部件中的單個元素上設置點擊監聽器

我要創建兩個箭頭,移動ViewFlipper到以前的和未來的看法,如本樣機:

enter image description here

在我WidgetServicegetViewAt()方法,我有以下代碼在意圖創建一個填充:

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中的視圖位置)中單擊了哪個按鈕。我不能找到一個Widget的例子,不幸的是,它使用點擊監聽器進行多個動作。

+1

只是想給一些反饋:您鏈接到說:「你RemoteViewsFactory必須設置文本填空題上的collection.This每個項目的意圖,能夠區分給定物品的單獨點擊動作。「所以我認爲你不能在按鈕上設置填充意圖(它們是項目的子項),就像這樣。 – 0X0nosugar

+0

@ 0X0nosugar感謝您的採訪,從文檔看來您似乎是對的。但是,我確實有一個使用帶有多個按鈕的ViewFlipper的小部件示例。如果只有我可以達到他們的源代碼峯值:( –

回答

1

您鏈接到的文檔與下面的語句有點誤導:

你RemoteViewsFactory必須在collection.This每個項目設定一個填空題意圖能夠區分各個在單擊某一項目的行動

那麼,你永遠不知道,直到你嘗試:有可能畢竟設置填充式意圖對個別孩子的RemoteViews我TEM。但是您必須爲每個按鈕使用單獨的Intent。我將展示如何在NEXT按鈕:

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行動(導航),以及作爲intent.getBooleanExtra("FLIP_TO_NEXT", false)onReceive()值,並相應地更新應用部件。例如,如果「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

這是非常好的,謝謝一噸! –