0

ウィジェットのボタンをクリックすると、トーストが表示されます。しかし、構成アクティビティを使用してボタンのキャプションを設定してからボタンをクリックすると、トーストが表示されません。なんで?

public class MyWidget extends AppWidgetProvider {

    public static String ACTION_WIDGET_CONFIGURE = "ConfigureWidget";
    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";

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


           RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

           Intent intent = new Intent(context, MyWidget.class);
           intent.setAction(ACTION_WIDGET_RECEIVER);
           PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
           remoteViews.setOnClickPendingIntent(R.id.btn_widget, actionPendingIntent);

           appWidgetManager.updateAppWidget(appWidgetIds, remoteViews); //update our widget
       }

      @Override
       public void onDeleted(Context context, int[] appWidgetIds) {
               super.onDeleted(context, appWidgetIds);
       }

       @Override
       public void onDisabled(Context context) {
               super.onDisabled(context);
       }

       @Override
       public void onEnabled(Context context) {
               super.onEnabled(context);
       }

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

         if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) 
         {
            Toast.makeText(context, "You have just clicked the button!", Toast.LENGTH_LONG).show();
         }
         super.onReceive(context, intent);

       }

Appwidget プロバイダー xml:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:initialLayout="@layout/widget_layout"
    android:minHeight="72dp"
    android:minWidth="72dp"
    android:configure="com.bfarago.tutorials.widget.ConfigActivity"
    > 
</appwidget-provider>

マニフェスト:

   <activity
            android:name=".ConfigActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
            </intent-filter>
        </activity>


        <receiver android:name="MyWidget" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
                <action android:name="com.bfarago.tutorials.widget.MyWidget.ACTION_WIDGET_RECEIVER"/>
            </intent-filter>    
            <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"/>
        </receiver>

構成アクティビティ:

public class ConfigActivity extends Activity {

    Button btn;
    EditText et;
    Context c;
    AppWidgetManager awm;
    int awID;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.config);

    btn = (Button)findViewById(R.id.btn);
    et = (EditText)findViewById(R.id.et);
    c = ConfigActivity.this;

    //Getting info about the widget that launched this Activity
    Intent i = getIntent();
    Bundle extras = i.getExtras();
    if (extras != null)
    {
        awID = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    }
    else
    {
        finish();
    }
    awm = AppWidgetManager.getInstance(c);


    btn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            String newcaption = et.getText().toString();

            RemoteViews views = new RemoteViews(c.getPackageName(), R.layout.widget_layout);
            views.setTextViewText(R.id.btn_widget, newcaption);
            views.setTextColor(R.id.btn_widget, Color.RED);
            awm.updateAppWidget(awID, views);

            Intent result = new Intent();
            result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, awID);
            setResult(RESULT_OK, result);
            finish();
        }
    });

    }
}

android:configure="com.bfarago.tutorials.widget.ConfigActivity"appwidgetprovider xml から行を削除すると 、Toast が表示されます。

4

1 に答える 1

0

configureActivityonClick呼び出しは、それが渡されたときにupdateAppWidget呼び出さsetOnClickPendingIntentれないRemoteViewsため、一度実行されると、ウィジェットからのクリック イベントは発生しません。メソッドと同じになるように修正するonUpdateか、コードをリファクタリングして、RemoteViewsと を呼び出す関数が 1 つだけになるようにしますupdateAppWidget

于 2013-07-08T23:33:04.290 に答える