2012-07-13 10 views
10

estoy haciendo un lanzador para Android, y estoy atascado en la parte de widgets. He estado buscando una hora y media en Internet tratando de descubrir cómo puedo alojar widgets en mi aplicación, pero no tuve suerte.widgets de alojamiento en un lanzador de Android

tengo pasó por algunos lanzadores de valores y códigos lanzador ADW pero ambos sólo hay miles de código y esta es la primera vez que estoy haciendo un lanzador.

Podría alguien por favor me guía a través de cómo puedo añadir widgets en mi lanzador? ¿O al menos publicar enlaces/tutoriales? Por favor explícalo ya que esta es mi primera vez.

+1

Aquí hay una buena explicación, junto con un proyecto de trabajo completo: http : //leonardofischer.com/hosting-android-widgets-my-appwidgethost-tutorial/ Fuente: http://leonardofischer.com/wp-content/uploads/2012/01/WidgetHostExample.zip sólo tiene que aplicar esta revisión : http://selvaline.blogspot.it/2015/10/hosting-widgets-and-regurally-update.html – Pascal

Respuesta

14

Prueba esto:

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(); 
} 

Todo lo que tienes que hacer es llamar al método selectWidget() cada vez que desee mostrar una lista de AppWidgets instaladas en el dispositivo para elegir.

Este código es un poco de una versión modificada de la población lanzador Android.

EDITAR:

Para aprisionar los ID de widget, es decir, hacer que la actualización widgets y responder a la interacción del usuario, consulte la solución aquí: Widgets don't respond when re-added through code

+0

Este es un conector d código de juego. Si tiene alguna duda, puede preguntar. –

+0

Gracias, lo intentaré ahora – user1446632

+0

No funciona. No sucede nada después de elegir un widget ... – user1446632

Cuestiones relacionadas