2012-04-15 3 views
3

Я создаю виджет для домашнего экрана Android с кнопкой clickable. После нажатия кнопки я обновляю TextView, используя данные из SharedPreferences. Я не знаю, что я делаю неправильно, но после нажатия кнопки обновляются все экземпляры виджета. Как обновить только щелкнутый виджет?Обновление только одного экземпляра AppWidget

TestWidgetConfiguration:

public class TestWidgetConfiguration extends Activity { 
    Button confirm; 
    EditText edit; 
    int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setResult(RESULT_CANCELED); 
     setContentView(R.layout.testwidgetconfiguration); 

     confirm = (Button)findViewById(R.id.button1); 
     confirm.setOnClickListener(confirmListener); 

     edit = (EditText)findViewById(R.id.editText1); 

     Intent intent = getIntent(); 
     Bundle extras = intent.getExtras(); 

     if(extras != null) { 
      mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 
     } 

     if(mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) { 
      finish(); 
     } 
    } 

    private Button.OnClickListener confirmListener = new Button.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent resultValue = new Intent(); 
      resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId); 

      SharedPreferences prefs = getSharedPreferences("prefs", 0); 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putInt("id:"+mAppWidgetId, Integer.parseInt(edit.getText().toString())); 
      editor.commit(); 

      AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(TestWidgetConfiguration.this); 
      TestWidget.updateAppWidget(TestWidgetConfiguration.this, appWidgetManager, mAppWidgetId); 

      setResult(RESULT_OK, resultValue); 
      finish(); 
     } 
    }; 
} 

TestWidget:

public class TestWidget extends AppWidgetProvider { 
    public static String ACTION = "TestAction"; 
    public static String URI_SCHEME ="ASD"; 

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

     Toast.makeText(context, "onUpdate()", Toast.LENGTH_SHORT).show(); 
    } 

    public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) { 
     SharedPreferences prefs = context.getSharedPreferences("prefs", 0); 
     int id = prefs.getInt("id:"+appWidgetId, 0); 

     RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.testwidget); 
     updateViews.setTextViewText(R.id.textView2, "[" + String.valueOf(appWidgetId) + "]" + id); 

     Intent intent = new Intent(context, TestWidget.class); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     intent.setAction(ACTION); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, intent, 0); 
     //Uri data = Uri.withAppendedPath(
     //  Uri.parse(URI_SCHEME + "://widget/id/") 
     //  ,String.valueOf(appWidgetId)); 
     //intent.setData(data); 

     updateViews.setOnClickPendingIntent(R.id.button1, pendingIntent); 
     appWidgetManager.updateAppWidget(appWidgetId, updateViews); 

     Toast.makeText(context, "updateAppWidget(): " + String.valueOf(appWidgetId) + "\n", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     super.onReceive(context, intent); 

     Toast.makeText(context, "onReceive()", Toast.LENGTH_SHORT).show(); 

     if (ACTION.equals(intent.getAction())) { 
      int idd = 0; 
      Bundle extras = intent.getExtras(); 

      if(extras != null) { 
       idd = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 
      } 

      Toast.makeText(context, "id: " + idd, Toast.LENGTH_SHORT).show(); 

      SharedPreferences prefs = context.getSharedPreferences("prefs", 0); 
      int id = prefs.getInt("id:"+idd, 0); 

      RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.testwidget); 
      rv.setTextViewText(R.id.textView1, "lala" + id); 

      ComponentName testWidget = new ComponentName(context, TestWidget.class); 
      AppWidgetManager manager = AppWidgetManager.getInstance(context); 
      manager.updateAppWidget(testWidget, rv); 
     } 
    } 
} 
+0

NVM ... Решение: Bundle статистов = intent.getExtras(); if (extras! = Null) { idd = extras.getInt (AppWidgetManager.EXTRA_APPWIDGET_ID); } ... manager.updateAppWidget (testWidget, rv); ===> manager.updateAppWidget (id, rv); – Ziem

ответ

0

Решение:

Bundle extras = intent.getExtras(); 
if(extras != null) { 
    idd = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID); 
} 

... 

manager.updateAppWidget(id, rv); // change 
0

В TestWidget#onReceive изменения следующие строки:

manager.updateAppWidget(testWidget, rv); 

к

manager.updateAppWidget(idd, rv); 

Это idd не id как Ziem написал в комментарии.

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