1

2 つのサイズから選択できるウィジェットがあり、設定もあります。しばらくすると、何らかの理由でウィジェットのボタンがバインド解除され、何もクリックできなくなります。なぜこれが起こっているのかわかりません。私の OnRecieve メソッドの super.onReceive(context, intent) でしょうか? それにより、バインドが解除される可能性がありますか?また、ボタンが常にバインドされていることを確認する確実な方法は何ですか?

AppWidgetProvider

public class mWidget extends AppWidgetProvider {
    public static String ACTION_WIDGET_REFRESH = "Refresh";
    public static final String PREFS_NAME = "mWidgetPrefs";

@Override
public void onEnabled(Context context) {

}

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

        RemoteViews remoteViews = buildLayout(context);

    appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);


}
public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
        int appWidgetId) {
    RemoteViews views = buildLayout(context);

    appWidgetManager.updateAppWidget(appWidgetId, views);
}

public static RemoteViews buildLayout(Context context) {


    RemoteViews remoteView = new RemoteViews(context.getPackageName(),
            R.layout.widget_4x2);
    Intent intent = new Intent(context, mWidget.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            intent, 0);

    intent = new Intent(context, mWidget.class);
    intent.setAction(ACTION_WIDGET_REFRESH);
    pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    remoteView.setOnClickPendingIntent(R.id.refresh, pendingIntent);

    return remoteView;

}

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



        RemoteViews remoteView = null;
        remoteView = new RemoteViews(context.getPackageName(),
                R.layout.widget_4x2);
        if (intent.getAction().equals(ACTION_WIDGET_REFRESH)) {
Toast.makeText(context, "here", Toast.LENGTH_LONG).show();

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


}

マニフェスト _

<?xml version="1.0" encoding="utf-8"?>

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".mwidgetConfig" android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
        </intent-filter>
    </activity>
    <activity android:name=".mwidgetConfigSmall"
        android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
        </intent-filter>
    </activity>
    <!-- BEGIN 4X4 WIDGET  -->
    <receiver android:label="Test Widget 4x4"
        android:name="com.test.mwidget.mWidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action
                android:name="com.test.mwidget.mWidget.ACTION_WIDGET_REFRESH" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/widget_4x4_provider" />
    </receiver>
    <!-- BEGIN 4X2 WIDGET  -->
    <receiver android:label="Test Widget 4x2"
        android:name="com.test.mwidget.mWidgetSmall">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action
                android:name="com.test.mwidget.mWidgetSmall.ACTION_WIDGET_REFRESH" />
        </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/widget_4x2_provider" />
    </receiver>

</application>

4

2 に答える 2

2
  1. onUpdate保留中のインテントを各イベントにバインドする必要があります。
  2. すべてを反復処理する必要がありますappWidgerIds

通常、私はウィジェットを次のように実装します。

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

    private static void updateAllWidgetsInternal(Context context, 
                                                 AppWidgetManager appWidgetManager,
                                                 int[] appWidgetIds) {
        final RemoteViews views = buildLayout(context);

        final int N = appWidgetIds.length;
            for (int i=0; i<N; ++i) {
            appWidgetManager.updateAppWidget(appWidgetIds[i], views);
        }
    }

    // This function can be executed anywhere in any time to update widgets
    public static void updateAllWidgets(Context context) {
        final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        final int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, mWidget.class));
        updateAllWidgetsInternal(context, appWidgetManager, appWidgetIds);
}
于 2011-03-22T18:35:33.770 に答える
0

を実装した理由がわかりませんonReceive()

ウィジェットがACTION_APPWIDGET_DELETEDACTION_APPWIDGET_DISABLED、 、ACTION_APPWIDGET_ENABLEDおよびACTION_APPWIDGET_UPDATE.

必要がない場合は、なしで試してくださいonReceive()

于 2011-03-22T18:24:49.223 に答える