0

私はAndroidプログラミングに不慣れで、これを何時間も理解しようとしていますが、それでも機能させることができません。2つのボタンを持つウィジェットを作成しています。1つのボタン(アクティビティを呼び出すボタン)は正常に機能しますが、画像を変更することを想定した別のボタン(トグルキーなど)は機能しません。取得しNullPointerExceptionます。問題を追跡しましたが、onReceiveに渡されたときにremoteViewsがnullのようです

public class Widget extends AppWidgetProvider {
boolean status = false;
private RemoteViews remoteViews;
Button bMain;

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

    final int n = appWidgetIds.length;
    for(int i = 0; i < n; i++){
        final int appWidgetId = appWidgetIds[i];

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

        Intent configIntent = new Intent(context, Main.class);
        configIntent.setAction("callingActivity");
        PendingIntent configPendingIntent = PendingIntent.getActivity(context,
                0, configIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.bWidgetMain,
                configPendingIntent);

        configIntent = new Intent(context, Widget.class);
        configIntent.setAction("callingibFlash");
        configPendingIntent = PendingIntent.getBroadcast(context, 0,
                configIntent, 0);
        remoteViews.setOnClickPendingIntent(R.id.ibFlash, configPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, remoteViews);
    }

}

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("callingActivity")) {
        Toast.makeText(context, "Main", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals("callingibFlash")) {
        remoteViews.setImageViewResource(R.id.ibFlash,
                R.drawable.flashlight_on);
    } else {
        super.onReceive(context, intent);
    }
}

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

1 に答える 1

0

remoteViews参照をインスタンス変数として保持するのではなく、ローカル変数として使用することをお勧めします。onReceive()を介して実装で新しい参照を取得し、で行っContextたようにを使用しAppWidgetManagerてウィジェットを更新できますonUpdate()

@Override
public void onReceive(Context context, Intent intent){
    if (intent.getAction().equals("callingActivity")) {
        Toast.makeText(context, "Main", Toast.LENGTH_SHORT).show();
    } else if (intent.getAction().equals("callingibFlash")) {
        ComponentName thisWidget = new ComponentName(context, Widget.class);
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        myRefactoredUpdate(context, appWidgetManager, appWidgetIds);
        // use for loop as in onUpdate to get to your remoteViews
        final int n = appWidgetIds.length;
        for (int i = 0; i < n; i++) {
            final int appWidgetId = appWidgetIds[i];
            remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
            remoteViews.setImageViewResource(R.id.ibFlash, R.drawable.flashlight_on);
        }
    } else {
        super.onReceive(context, intent);
    }
}

新しいRemoteViewを入手したら、setImageViewResource()やその他の必要なものを呼び出すことができます。いずれの場合も、super.onReceiveを呼び出す方がよい場合があります。

于 2013-03-18T16:15:14.700 に答える