2016-09-26 7 views
1

Я создаю виджет коллекции, поддерживаемый ViewFlipper, и столкнулся с проблемой при просмотре документов Android на adding behavior to individual items.Настройка кликов по отдельным элементам виджета ViewFlipper

Я хочу создать две стрелы, которые двигают ViewFlipper к его предыдущему и следующему виду, как показаны в этом макете:

enter image description here

В моем WidgetService «ы getViewAt() метода, я следующий кодом создать заливку в намерении:

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); 

Что меня смущает в дизайне, так это то, должен ли я называть на каждой кнопке. Если я задаю намерение каждой кнопке, мне нужно определить, какая кнопка была нажата в моем WidgetProvider методе onUpdate (все, что у меня есть сейчас, является видом представления в ViewFlipper). К сожалению, я не смог найти пример виджета, который, к сожалению, использует прослушиватели кликов для нескольких действий.

+1

Просто хотел, чтобы дать обратную связь: текст, связанный с «Вашей RemoteViewsFactory необходима установить заливку в намерениях по отношению к каждому элементу collection.This позволяет отличить индивидуальное действие щелчка по заданному элементу ». Поэтому я думаю, что вы не можете установить заливку на кнопки (они являются дочерними элементами), как раз на элементах как таковых. – 0X0nosugar

+0

@ 0X0nosugar Спасибо, что посмотрели, похоже, что вы правы от документов. Однако у меня есть пример виджета, который использует ViewFlipper с несколькими кнопками. Если бы я мог пик в их исходный код :( –

ответ

1

Документация вы связаны с является немного вводит в заблуждение со следующим предложением:

Ваш RemoteViewsFactory необходимо установить вставку, намерения по отношению к каждому элементу collection.This позволяет различать отдельные на щелчок действие данного пункта

Ну, вы никогда не знаете, пока вы не попробуете: можно ведь установить заполняются в фактически на отдельных детей в RemoteViews я ПЭМ. Но для каждой из кнопок вы должны использовать отдельный 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), а также значение 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

Это отлично, спасибо тонну !! –