4

いくつかの機能をテストするには、AppWidget id を見つける必要があります。これを行うコード:

List<AppWidgetProviderInfo> infos = mAppWidgetManager.getInstalledProviders();

        for (int i = 0; i < infos.size(); i++) {
            int ids[] = mAppWidgetManager.getAppWidgetIds(infos.get(i).provider);
            if (ids.length != 0) {
                Log.d("TAG", "Found non-zero-length provider!");
                id = ids[0];
                info = infos.get(i);
                break;
            }
        }

しかし、ids[] の長さは常に 0 です! なぜ、どのように修正するのですか?

更新:ループの先頭に次の行を追加しました。

Log.d("TAG", provider.getPackageName() + "; " + provider.getClassName());

そしてそれは印刷します:

D/TAG     ( 5686): Providers count: 12
D/TAG     ( 5686): com.andrew.apollo; com.andrew.apollo.app.widgets.AppWidget11
D/TAG     ( 5686): com.andrew.apollo; com.andrew.apollo.app.widgets.AppWidget41
D/TAG     ( 5686): com.andrew.apollo; com.andrew.apollo.app.widgets.AppWidget42
D/TAG     ( 5686): com.android.browser; com.android.browser.widget.BookmarkThumbnailWidgetProvider
D/TAG     ( 5686): com.android.calendar; com.android.calendar.widget.CalendarAppWidgetProvider
D/TAG     ( 5686): com.android.contacts; com.android.contacts.socialwidget.SocialWidgetProvider
D/TAG     ( 5686): com.android.deskclock; com.android.alarmclock.AnalogAppWidgetProvider
D/TAG     ( 5686): com.android.email; com.android.email.provider.WidgetProvider
D/TAG     ( 5686): com.android.gallery3d; com.android.gallery3d.gadget.PhotoAppWidgetProvider
D/TAG     ( 5686): com.android.quicksearchbox; com.android.quicksearchbox.SearchWidgetProvider
D/TAG     ( 5686): com.android.settings; com.android.settings.widget.SettingsAppWidgetProvider
D/TAG     ( 5686): com.android.vending; com.android.vending.MarketWidgetProvider

それで、問題ないようですが、まだこのウィジェットの ID を取得できません。

4

3 に答える 3

5

マニフェスト内のウィジェット プロバイダーと一致ComponentNameするものを取得するために使用していることを確認してください。AppWidgetManagerそうでない場合は、空のリストが返されます (ids.length = 0、ループは実行されません)。

于 2012-09-12T00:53:32.653 に答える
2

ウィジェットのレイアウトとサイズが異なるため、すべての ID を取得するさまざまなウィジェット プロバイダーはそれほど単純ではないことがわかりました。すべてのウィジェット プロバイダーのすべてのウィジェット ID を取得するには、次のようにします。

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    int Widged_IDS_A[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProviderA.class));
    int Widged_IDS_B[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProviderB.class));
    int Widged_IDS_C[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProviderC.class));
    int Widged_IDS_D[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProviderD.class));
    int Widged_IDS_E[] = appWidgetManager.getAppWidgetIds(new ComponentName(context, WidgetProviderE.class));

    int allWidgetIds[] = new int[Widged_IDS_A.length + Widged_IDS_B.length + Widged_IDS_C.length + Widged_IDS_D.length + Widged_IDS_E.length];

    System.arraycopy(Widged_IDS_A, 0, allWidgetIds, 0, Widged_IDS_A.length);
    System.arraycopy(Widged_IDS_B, 0, allWidgetIds, Widged_IDS_A.length, Widged_IDS_B.length);
    System.arraycopy(Widged_IDS_C, 0, allWidgetIds, Widged_IDS_A.length + Widged_IDS_B.length, Widged_IDS_C.length);
    System.arraycopy(Widged_IDS_D, 0, allWidgetIds, Widged_IDS_A.length + Widged_IDS_B.length + Widged_IDS_C.length, Widged_IDS_D.length);
    System.arraycopy(Widged_IDS_E, 0, allWidgetIds, Widged_IDS_A.length + Widged_IDS_B.length + Widged_IDS_C.length + Widged_IDS_D.length, Widged_IDS_E.length);
    Log.v(Classname, "allWidgetIds.length: " + allWidgetIds.length);

    allWidgetIds = merge(Widged_IDS_A, Widged_IDS_B, Widged_IDS_C, Widged_IDS_D, Widged_IDS_E);
    for (int x : allWidgetIds) {
         Log.v(Classname, x + " allWidgetIds onReceive()");
    }
于 2014-08-12T23:40:24.703 に答える