2017-10-06 5 views
1

Anstatt den Benutzer eine Liste der Widget-Anbieter anzuzeigen, lassen Sie ihn wählen und konfigurieren Sie das Widget, ich manuell laden alle Widget-Anbieter und lassen Sie den Benutzer Drag-and-Drop diese Widgets in meiner App. Sobald der Benutzer ein solches Symbol löscht, möchte ich dieses Widget erstellen und konfigurieren. Wie mache ich das?Erstellen Widget mit bekannten AppWidgetProviderInfo

Code mit Kommentaren

// 1) get a list of all app widget providers 
List<AppWidgetProviderInfo> providers = mAppWidgetManager.getInstalledProviders(); 

// 2) Display the list to the user and let him select a widget provider => done via custom UI 

// 3) handle the user selected widget and create it 
// 3.1) create new widget id 
int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); 
// 3.2) configure widget 
// ??? How do I do this now? appWidgetInfo.configure = null, so I can't use this as I normally would do it 
// 4) Save the appWidgetId or delete it again depending on if the user finished the setup or cancelled it 

Normale Annäherung (nicht wichtig für meinen Anwendungsfall, sondern beschreibt allgemein, wie es funktioniert)

  • eine Widget-ID erstellen und verwenden Sie dann die AppWidgetManager.ACTION_APPWIDGET_PICK Absicht, den Benutzer ein Widget wählen
  • nach der Auswahl, übergeben Sie die Daten an die AppWidgetManager.ACTION_APPWIDGET_CONFIGURE Vorsatz und intent.setComponent(appWidgetInfo.configure);
  • nach dem Setup verwenden, um die Widget-ID speichern (oder löschen, wenn der Benutzer das Setup abgebrochen) in meinen benutzerdefinierten Daten und verwenden Sie die ID das Widgets
  • => Für meinen Fall zu zeigen und zu aktualisieren, ist dies Feinwerk ...

Frage

Wie erhalte ich eine gültige AppWidgetProviderInfo mit einem configure Feld = null, so dass ich folgende verwenden:

Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); 
// appWidgetInfo.configure is null for appWidgetInfo received from mAppWidgetManager.getInstalledProviders() 
// it is not if the appWidgetInfo is received via the AppWidgetManager.ACTION_APPWIDGET_PICK intent... 
intent.setComponent(appWidgetInfo.configure); 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
activity.startActivityForResult(intent, WIDGET_CONFIGURE_REQUEST_CODE); 

Oder gibt es einen alternativen Ansatz dazu?

Ich glaube, ich irgendwie ein Widget mit den AppWidgetProviderInfo manuell erstellen muß und rege dann die Informationen mit mAppWidgetManager.getAppWidgetInfo(appWidgetId); und dann werde ich ein gefülltes configure Feld habe, da dies, wenn ich AppWidgetManager.ACTION_APPWIDGET_PICK Absicht verwenden scheint zu passieren, aber ich weiß nicht, dass ich tun Sie dies manuell ...

Antwort

0

Ich könnte das Problem lösen. Die ACTION_APPWIDGET_PICK Absicht bindet das Widget an die ID, so dass dies in meinem Fall manuell getan werden muss:

private static void configureWidgetManually(AppCompatActivity activity, AppWidgetProviderInfo appWidgetInfo) { 
    int appWidgetId = mAppWidgetHost.allocateAppWidgetId(); 

    boolean hasPermission = mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, appWidgetInfo.provider); 
    if (!hasPermission) { 
     // this if part is untested, I never get into this part, but from my understanding it should work like this... 
     Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, appWidgetInfo.provider); 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER_PROFILE, appWidgetInfo.getProfile()); 
     } 
     // Result of this can be handled the same way as the result of AppWidgetManager.ACTION_APPWIDGET_PICK, so we can even use the same request code... 
     activity.startActivityForResult(intent, WIDGET_SELECTOR_REQUEST_CODE); 
    } else { 
     // Widget is bound, we can continue as if we would have used the `AppWidgetManager.ACTION_APPWIDGET_PICK` intent 
     appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId); 
     configureWidget(activity, appWidgetId, appWidgetInfo); 
    } 
} 

private static void configureWidget(AppCompatActivity activity, int appWidgetId, AppWidgetProviderInfo appWidgetInfo) { 

    if (appWidgetInfo.configure != null) { 
     Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); 
     intent.setComponent(appWidgetInfo.configure); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     activity.startActivityForResult(intent, WIDGET_CONFIGURE_REQUEST_CODE); 
    } else { 
     // widget is configured, do whatever you want with the id... 
    } 
} 
Verwandte Themen