2012-07-13 15 views
10

Ben android için bir başlatıcısı yapıyorum ve ben widget bölümünde sıkışıp kaldım. İnternette bir buçuk saat ara veriyorum, uygulamada widget'ları nasıl barındırabilirim, ama şans yok.Barındırma widget'ları

Bazı stok başlatıcıları ve ADW başlatıcısı kodlarını inceledim ancak her ikisinin de kodları var ve bu, ilk kez bir başlatıcı yapıyorum.

Başlatıcıdan başlatıcıya nasıl widget ekleyebilirim? Ya da en azından herhangi bir bağlantı/öğretici göndermek? Lütfen bunu ilk defa beri açıkla.

+1

tam çalışan bir proje ile birlikte iyi bir açıklaması var: http Kaynak: http://leonardofischer.com/wp-content/uploads/2012/01/WidgetHostExample.zip Sadece bu düzeltmeyi uygulamanız yeterlidir. : http://selvaline.blogspot.it/2015/10/hosting-widgets-and-regurally-update.html – Pascal

cevap

14

bu deneyin:

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

yapmanız gereken tek şey almak size cihazda yüklü AppWidgets listesini göstermek istediğinizde yöntemini selectWidget() çağırmak.

Bu kod stok Android başlatıcısı için değiştirilmiş bir sürümü biraz.

DÜZENLEME:

, yani widget'lar güncelleme yapmak ve kullanıcı etkileşimine yanıt, widget kimlikleri bağlamak burada çözüm başvurmak için: Burada Widgets don't respond when re-added through code

+0

Bu bir d oyun kodu. Herhangi bir şüpheniz varsa, sorabilirsiniz. –

+0

Teşekkürler şimdi deneyeceğim – user1446632

+0

Çalışmıyor. Bir widget seçtikten sonra hiçbir şey olmuyor ... – user1446632

İlgili konular