2012-07-13 16 views
10

Sto facendo un launcher per Android, e sono bloccato nella parte del widget. Ho cercato per circa un'ora e mezza su internet cercando di capire come posso ospitare i widget nella mia applicazione, ma senza fortuna.Hosting di widget in un launcher Android

Ho attraversato alcuni sistemi di avvio di azioni e codici di avvio ADW, ma entrambi hanno solo miglia di codice e questa è la prima volta che faccio un lanciatore.

Qualcuno potrebbe guidarmi attraverso come posso aggiungere widget al mio launcher? O almeno pubblichi link/tutorial? Per favore, spiegamelo dato che questa è la mia prima volta.

+1

Ecco una buona spiegazione insieme ad un progetto di lavoro completo: http : //leonardofischer.com/hosting-android-widgets-my-appwidgethost-tutorial/ Fonte: http://leonardofischer.com/wp-content/uploads/2012/01/WidgetHostExample.zip Basta applicare questa correzione : http://selvaline.blogspot.it/2015/10/hosting-widgets-and-regurally-update.html – Pascal

risposta

14

Prova questo:

final int APPWIDGET_HOST_ID = 2048; 
final int REQUEST_PICK_APPWIDGET = 0; 
final int REQUEST_CREATE_APPWIDGET = 5; 

AppWidgetManager appWidgetManager; 
AppWidgetHost appWidgetHost; 

// Let user pick a widget from the list of intalled AppWidgets 
public void selectWidget() 
{ 
    int appWidgetId = this.appWidgetHost.allocateAppWidgetId(); 
    Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK); 
    pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
    addEmptyData(pickIntent); 
    startActivityForResult(pickIntent, REQUEST_PICK_APPWIDGET); 
} 

// For some reason you have to add this empty data, else it won't work 
public void addEmptyData(Intent pickIntent) 
{ 
    ArrayList<AppWidgetProviderInfo> customInfo = 
     new ArrayList<AppWidgetProviderInfo>(); 
    pickIntent.putParcelableArrayListExtra(
     AppWidgetManager.EXTRA_CUSTOM_INFO, customInfo); 
    ArrayList<Bundle> customExtras = new ArrayList<Bundle>(); 
    pickIntent.putParcelableArrayListExtra(
     AppWidgetManager.EXTRA_CUSTOM_EXTRAS, customExtras); 
}; 

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
           Intent data) { 
    if (resultCode == RESULT_OK) { 
     if (requestCode == REQUEST_PICK_APPWIDGET) { 
      configureWidget(data); 
     } 
     else if (requestCode == REQUEST_CREATE_APPWIDGET) { 
      createWidget(data); 
     } 
    } 
    else if (resultCode == RESULT_CANCELED && data != null) { 
     int appWidgetId = 
      data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
     if (appWidgetId != -1) { 
      appWidgetHost.deleteAppWidgetId(appWidgetId); 
     } 
    } 
} 

// Show configuration activity of the widget picked by the user 
private void configureWidget(Intent data) { 
    Bundle extras = data.getExtras(); 
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
    AppWidgetProviderInfo appWidgetInfo = 
      appWidgetManager.getAppWidgetInfo(appWidgetId); 
    if (appWidgetInfo.configure != null) { 
     Intent intent = 
      new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE); 
     intent.setComponent(appWidgetInfo.configure); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
     startActivityForResult(intent, REQUEST_CREATE_APPWIDGET); 
    } else { 
     createWidget(data); 
    } 
} 

// Get an instance of the selected widget as a AppWidgetHostView 
public void createWidget(Intent data) { 
    Bundle extras = data.getExtras(); 
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); 
    AppWidgetProviderInfo appWidgetInfo = appWidgetManager.getAppWidgetInfo(appWidgetId); 

    AppWidgetHostView hostView = appWidgetHost.createView(this, appWidgetId, appWidgetInfo); 
    hostView.setAppWidget(appWidgetId, appWidgetInfo); 
    // Add it on the layout you want 
    myLayout.addView(hostView); 
} 

// Call this when you want to remove one from your layout 
public void removeWidget(AppWidgetHostView hostView) { 
    appWidgetHost.deleteAppWidgetId(hostView.getAppWidgetId()); 

    // Remove from your layout 
    myLayout.removeView(hostView); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    appWidgetManager = AppWidgetManager.getInstance(this); 
    appWidgetHost = new AppWidgetHost(this, APPWIDGET_HOST_ID); 

    // Start listening to pending intents from the widgets 
    appWidgetHost.startListening(); 
} 

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

Tutto quello che devi fare è chiamare il metodo selectWidget() ogni volta che si desidera visualizzare un elenco di AppWidgets installati sul dispositivo da scegliere.

Questo codice è un po 'una versione modificata del launcher Android di serie.

EDIT:

Per associare gli ID dei widget, cioè rendere aggiornamento widget e rispondere all'interazione dell'utente, vedere la soluzione qui: Widgets don't respond when re-added through code

+0

Questa è una spina e d riprodurre il codice. Se hai dei dubbi, puoi chiedere. –

+0

Grazie, proverò ora – user1446632

+0

Non funziona. Non succede nulla dopo aver scelto un widget ... – user1446632