4

私はランチャーに取り組んでいます。ユーザーがリストからウィジェットを追加できるようにします。正常に機能します。ユーザーがウィジェットを画面に追加すると、ウィジェットに関する情報(PackageName、ClassName、および画面上の座標)がデータベースに保存されます。

アプリケーション(またはデバイス自体)が再起動されたら、コードを介してそれらの(ユーザーが選択した)ウィジェットを追加し直します。

// APPWIDGET_HOST_ID is any number you like
appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetHost = new AppWidgetHost(this, APPWIDGET_HOST_ID);
AppWidgetProviderInfo newAppWidgetProviderInfo = new AppWidgetProviderInfo();

// Get an id
int appWidgetId = appWidgetHost.allocateAppWidgetId();

// Get the list of installed widgets
List<AppWidgetProviderInfo> appWidgetInfos = new ArrayList<AppWidgetProviderInfo>();
appWidgetInfos = appWidgetManager.getInstalledProviders();

for(int j = 0; j < appWidgetInfos.size(); j++)
{
    if (appWidgetInfos.get(j).provider.getPackageName().equals(PackageName) && appWidgetInfos.get(j).provider.getClassName().equals(ClassName))
    {
        // Get the full info of the required widget
        newAppWidgetProviderInfo = appWidgetInfos.get(j);
        break;
    }
 }

// Create Widget
AppWidgetHostView hostView = appWidgetHost.createView(this, appWidgetId, newAppWidgetProviderInfo);
hostView.setAppWidget(appWidgetId, newAppWidgetProviderInfo);

// Add it to your layout
RelativeLayout widgetLayout = (RelativeLayout) findViewById(R.id.widgetLayout);
widgetLayout.addView(hostView);

ウィジェットはレイアウトに正常に追加されましたが、有効化/更新されていないようです。クリックに応答せず(たとえば、アナログ時計)、データも表示されません(たとえば、音楽プレーヤーウィジェット)。

@Override
protected void onStart() {
    super.onStart();
    appWidgetHost.startListening();
}

@Override
protected void onStop() {
    super.onStop();
    appWidgetHost.stopListening();
}

かなり長い間、私はそれに固執しています。たくさん検索しましたが、この問題を抱えているのは私だけのようです。

4

1 に答える 1

6

アプリがウィジェットIDを次のコードでバインドできるようにすることをユーザーに求めるダイアログを呼び出すことができます。

Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, sSavedWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, mWidgetInfo.provider);
startActivityForResult(intent, REQUEST_BIND_WIDGET);

そして、ウィジェットIDをバインドして、実際に機能するようにします。

Bundle opts = new Bundle();
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, maxWidth);
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, minHeight);
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH, maxWidth);
opts.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT, maxHeight);

widgetManager.bindAppWidgetIdIfAllowed(widgetId, mWidgetInfo, opts);

詳細については、以下を参照してください。

誰かが5年前に同じように答えていたらよかったのに。

于 2017-06-04T06:23:19.353 に答える