2011-11-26 14 views
5

Yeni bir pencere aracı oluşturma etrafında oynuyorum ve özellikle widget sınıflarının desteklendiği bölüm olan Android app widget documentation'a bakıyordum. ViewFlipper'un desteklendiğini fark ettim, ancak ana ekran widget'ında nasıl kullanılacağına dair örnekler bulmaya çalışıyorum. Özellikle, takas görünümlerini manuel olarak tetiklemenin mümkün olup olmadığını merak ediyorum. Bir aktivitede bu nispeten basit bir şekilde görülebilir; bir örnek, bir düğmenin onclick dinleyicisini, flipperın showNext() 'ını çağırmak için kancalamaktır.Görünüm widget'larında ViewFlipper

RemoteViews nesnesinin showNext ve showPrevious yöntemleri vardır, ancak bunları, widget'la etkileşimde bulunan kullanıcıdan çıkan bir olaya nasıl bağlayacağımı anladığımdan emin değilim. Bu yöntemlerin ne zaman çağrılabileceği konusunda örnekler verebilir mi?

Widget'lardaki düğmeler, yalnızca kanatçıkları çalıştırmak için kod yerine amaçlara bağlanabilir. Bu kısıtlama doğruysa, görünümlerin otomatik olarak çevrilmesi için bir uygulama widget'ındaki bir görünüm paletinin tek kullanımı nedir?

cevap

8

2 düğmeniz var: SOL ve SAĞ. . Öncelikle burada Service#onStart den tetiklenen her (için bekleyen niyet iliştirirdi: Sonra

@Override 
public void onStart(Intent intent, int startId) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); 
    int[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); 
    // add listeners for every widget registered 
    for (int widgetId : allWidgetIds) { 
     addClickListeners(appWidgetManager, widgetId, root); 
    } 
    stopSelf(); 
} 

protected void addClickListeners(AppWidgetManager appWidgetManager, int widgetId, RemoteViews root) { 
    root.setOnClickPendingIntent(R.id.left, getNavigationIntent(widgetId, R.id.left)); 
    root.setOnClickPendingIntent(R.id.right, getNavigationIntent(widgetId, R.id.right)); 
} 

protected PendingIntent getNavigationIntent(int widgetId, final int id) { 
    Intent clickIntent = new Intent(this, WidgetProvider.class); 
    clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
    clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId); 
    clickIntent.putExtra(TRIGGER, id); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent, 
      PendingIntent.FLAG_UPDATE_CURRENT); 
    return pendingIntent; 
} 

Bu yapmalı AppWidgetProvider yılında

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    Bundle extras = intent.getExtras(); 
    Integer id = (Integer) (extras == null ? null : extras.get(TRIGGER)); 
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action) && id != null) { 
     int widgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, 0); 
     onNavigate(context, widgetId, id); 
    } else { 
     super.onReceive(context, intent); 
    } 
} 


protected void onNavigate(Context context, Integer widgetId, Integer id) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    RemoteViews root = new RemoteViews(context.getPackageName(), R.layout.app_widget); 
    if (id == R.id.left) { 
     root.showPrevious(R.id.scroll); 
    } else { 
     root.showNext(R.id.scroll);    
    } 
    appWidgetManager.updateAppWidget(widgetId, root); 
} 

yapmak Şimdi sorun - bu yalnızca API çalışacak 11 + ve ben sadece root.setInt(R.id.scroll, "setDisplayedChild", pos) API 7 içinde çalışmayacak zor yolunu buldum.

+0

Harika cevap, çok teşekkür ederim Ne yazık ki benim app API 7 +, bu yüzden deneyebilirsiniz önce biraz beklemek zorundayım Yukarıdaki, ama bazı gerçekten açılır benim widget'ları ile teresting olanakları. Paylaşım için teşekkürler. –

+0

Aynı konuyla uğraşmak zorunda kaldım ve sadece TextView ve ImageView ile tek LinearLayout'a sahip oldum ve daha sonra navigasyon olayını tespit ettiğinizde değerleri değiştirelim. Fantezi kayma efektleri yok ama yeterince iyi – Bostone

+1

Animasyon eklediğimde, uygulama widget'ım çalışmıyor. Bir ev uygulaması widget'ı animasyonlarla flip çalışması yapmanın bir yolu var mı? ' ' –