2013-03-21 3 views
2

Я внедрил widget с ImageButton и TextView. То, что ImageButton запускает activity, когда его щелкнули. Этот activity обновляет текст виджетов тем, что пользователь пишет по активности EditText. Теперь проблема заключается в том, что я только знаю, как получить идентификаторы, как это:Как узнать идентификатор виджета?

for (int widgetId : allWidgetIds) { 
     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(getApplicationContext() 
       .getPackageName(), R.layout.widget_layout); 
     Log.w("WidgetExample", String.valueOf(number)); 

     //Here I should set text from edit text, but I'm using a random for testing. 

     remoteViews.setTextViewText(R.id.textView1, 
       "Random: " + String.valueOf(number)); 

     appWidgetManager.updateAppWidget(widgetId, remoteViews); 
    } 

Этот код будет, очевидно, изменить данные всех идентификаторов, так как его внутри for. Есть ли в любом случае, что я могу пройти мимо щелчка widgetId с моими намерениями, поэтому я могу устранить этот for? Это мой widgetProvider:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
     int[] appWidgetIds) { 

    // Get all ids 
    ComponentName thisWidget = new ComponentName(context, Widget.class); 
    allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); 
    for (int widgetId : allWidgetIds) { 

     Intent i = new Intent(context, WidgetSetup.class); 
     i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 
     i.setFlags(i.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 

     // Create some random data 
     int number = (new Random().nextInt(100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), 
       R.layout.widget_layout); 
     // Set the text 
     remoteViews.setTextViewText(R.id.textView1, String.valueOf(number)); 

     Intent active = new Intent(context, Widget.class); 
     active.setAction(ACTION_WIDGET_REFRESH); 
     PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
     remoteViews.setOnClickPendingIntent(R.id.imageButton1, actionPendingIntent); 

     active = new Intent(context, Widget.class); 
     active.setAction(ACTION_WIDGET_SETTINGS); 
     actionPendingIntent = PendingIntent.getBroadcast(context, 0, active, 0); 
     remoteViews.setOnClickPendingIntent(R.id.imageButton2, actionPendingIntent); 

     appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); 
    } 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) { 
     //Log.i("onReceive", ACTION_WIDGET_REFRESH); 

     Intent i = new Intent(context, MainActivity.class); 
     i.setFlags(i.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 

    } else if (intent.getAction().equals(ACTION_WIDGET_SETTINGS)) { 
     //Log.i("onReceive", AppWidgetManager.EXTRA_APPWIDGET_ID); 



     Intent i = new Intent(context, WidgetSetup.class); 
     i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); 

     //Here I tried to pass the widgetID with no luck. 
     //i.putExtra(pass widget id?); 

     i.setFlags(i.FLAG_ACTIVITY_NEW_TASK); 
     context.startActivity(i); 

    } else { 
     super.onReceive(context, intent); 
    } 
} 

Благодаря

ответ

10

Для работающего примера взгляните на мой код для MiniCallWidget линий 97 и 169.

+0

Отлично, только то, что мне нужно. Thanks –

+1

Вы спасатель жизни! Это была эта небольшая часть (строка 169), которая не была на месте и приводила меня в бешенство. Большое спасибо :) – ranjk89

+0

Его линия ** 120 ** (для widgetManager)! –

1

Добавить Extra намерению вы запускаете OnClick и создать в цикл, который определяет идентификатор текущего виджета будучи установки.

Затем извлеките идентификатор из дополнительных функций в принимающей операции и передайте его, когда закончите. Затем используйте возвращаемый идентификатор, чтобы внести изменения только в один виджет.

Вы можете сделать это с помощью if-else, который также проверяет флаг, который сообщает, обновляет ли только один виджет.

+0

Я знаю, но какое значение я должен установить, что дополнительно? –

+0

Ну, ваш цикл for повторяется над 'allWigetIds', а текущий идентификатор виджета -' widgetId'. Поэтому добавьте int extra с помощью 'widgetId'. –

+0

Я все еще не понимаю, что вы имеете в виду, можете ли вы быть более конкретным? Спасибо –

Смежные вопросы