3

クリック可能なボタンでAndroidホーム画面ウィジェットを作成しています。ボタンをクリックした後、SharedPreferencesのデータを使用してTextViewを更新しています。何が間違っているのかわかりませんが、ボタンをクリックすると、ウィジェットの各インスタンスが更新されます。クリックしたウィジェットのみを更新するにはどうすればよいですか?

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

2 に答える 2

0

TestWidget#onReceiveの行を変更します。

manager.updateAppWidget(testWidget, rv);

manager.updateAppWidget(idd, rv);

Ziemがコメントに書いたように、iddではありません。

于 2014-01-28T23:27:34.010 に答える