Android-виджет отключить список вложенных кнопок onclick
Я делаю приложение для Android, у которого есть просмотр списка с нажимаемыми кнопками (вложенный просмотр списка). Виджет "Рабочий стол" приложения также имеет почти такой же макет.
Необходимо отключить кнопку после нажатия. В упражнении я могу легко отключить кнопку как:
button.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
// Disable Button
v.setEnabled(false);
// Mark item as not received
Toast.makeText(getApplicationContext(), "Button Disabled", Toast.LENGTH_SHORT).show();
}
});
Для части виджета я использую RemoteViewFactory, чтобы настроить элементы списка с помощью кнопок. Код следует:
public class ListProvider implements RemoteViewsFactory {
.....
public RemoteViews getViewAt(int position) {
final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.list_row); //The layout of single list row
remoteView.setTextViewText(R.id.heading, "Some Heading");
remoteView.setTextViewText(R.id.content, "Some Content");
Intent fillInIntent = new Intent();
fillInIntent.putExtra(WidgetProvider.EXTRA_ITEM, position);
remoteView.setOnClickFillInIntent(R.id.buttonwidget, fillInIntent);
.....
}
.....
}
Теперь, когда кнопка настроена, я могу получить ее в WidgetProvider's. onReceive()
метод как:
public class WidgetProvider extends AppWidgetProvider {
public static final String EXTRA_ITEM = "com.example.android.stackwidget.EXTRA_ITEM";
public static final String ACTION_START_ACTIVITY = "startActivity";
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; ++i) {
RemoteViews remoteViews = updateWidgetListView(context,appWidgetIds[i]);
Intent clickIntent = new Intent(context, WidgetProvider.class);
clickIntent.setAction(ACTION_START_ACTIVITY);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, clickIntent, 0);
remoteViews.setPendingIntentTemplate(R.id.listViewWidget, pendingIntent);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,AppWidgetManager.INVALID_APPWIDGET_ID);
RemoteViews remoteViews = updateWidgetListView(context,appWidgetId);
ComponentName thisWidget = new ComponentName(context, WidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
//Printing detail of clicked item from widget
if(ACTION_START_ACTIVITY.equals(intent.getAction())) {
//Disable the button
remoteViews.setBoolean(R.id.buttonwidget, "setEnabled", false);
Toast.makeText(context, "Widget Button Clicked", Toast.LENGTH_SHORT).show();
}
//Update the widget again
manager.updateAppWidget(thisWidget, remoteViews);
}
}
Этот метод также работает хорошо, за исключением того, что он обновляет только кнопку первого списка элементов. Я хочу, чтобы отключить кнопку соответствующего элемента списка, который нажимается. Так что мне может понадобиться элемент позиции. Поэтому я подумал о том, чтобы получить намерение в RemoteViewsFactory getViewAt
метод, поскольку он занимает позицию listitem. Но я не могу получить намерение. Вот модифицированный код RemoteViewsFactory
:
public RemoteViews getViewAt(int position) {
final RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.list_row); //The layout of single list row
remoteView.setTextViewText(R.id.heading, "Some Heading");
remoteView.setTextViewText(R.id.content, "Some Content");
//Get the intent of button here
if(WidgetProvider.ACTION_START_ACTIVITY.equals(this.remoteIntent.getAction())) {
Toast.makeText(context, "Listitem Complete Button Clicked: "+position, Toast.LENGTH_SHORT).show();
}
Intent fillInIntent = new Intent();
fillInIntent.putExtra(WidgetProvider.EXTRA_ITEM, position);
remoteView.setOnClickFillInIntent(R.id.buttonwidget, fillInIntent);
.....
}
Надеюсь, вы, ребята, поняли смысл. Как установить / изменить кнопку в определенной позиции элемента?
РЕДАКТИРОВАТЬ: я применил решение, приведенное ниже, и это заставило меня работать. Теперь я могу раскрыть намерения и соответствующие данные вместе с ним. У меня осталась одна проблема. Кнопка должна быть изменена на другое изображение, в зависимости от состояния. В простом смысле, просмотр списка необходимо обновить, что я и сделал, сгенерировав случайное число и отправив его вместе с сервисным намерением. Как объяснено здесь.
1 ответ
Вот как я реализовал нечто подобное:
В классе, который реализует RemoteViewsFactory
У меня есть ArrayList пользовательских объектов. Я использую их, чтобы надуть и вернуть RemoteViews
от getViewAt(int)
метод. Один из членов моего пользовательского объекта boolean isEnabled
, Исходя из выбора пользователя, я устанавливаю эту переменную-член и вызываю обновление / обновление для моего виджета.
Внутри getViewAt(int)
метод, я проверяю значение isEnabled
и действовать на это:
@Override
public RemoteViews getViewAt(int position) {
final RemoteViews remoteView = new RemoteViews(
mContext.getPackageName(), R.layout.app_widget_listview);
MyCustomObj info = mEntries.get(position);
if (info.isEnabled()) {
remoteView.setBoolean(R.id.buttonwidget, "setEnabled", true);
} else {
remoteView.setBoolean(R.id.buttonwidget, "setEnabled", false);
}
Bundle extras = new Bundle();
extras.putInt(Constants.POSITION_IN_LIST, position);
Intent fillInIntent = new Intent();
fillInIntent.putExtras(extras);
remoteView.setOnClickFillInIntent(R.id.buttonwidget, fillInIntent);
return remoteView;
}
внутри onReceive(Context, Intent)
, Я получаю положение нажатой кнопки - и обновляю isEnabled
статус MyCustomObj
в этой позиции - и обновить виджет.