ViewFlipper в виджетах приложения - PullRequest
5 голосов
/ 27 ноября 2011

Я работаю над созданием нового виджета и искал документацию по для Android-приложений , в частности, раздел, в котором поддерживаются классы виджетов.Я заметил, что ViewFlipper поддерживается, но я изо всех сил пытаюсь найти примеры того, как использовать его в виджете домашнего экрана.В частности, мне интересно, возможно ли вручную вызвать переключение представлений.В действии это выглядит относительно просто, один из примеров - подключение прослушивателя onclick кнопки для вызова showNext () флиппера.

Объект RemoteViews имеет методы showNext и showPrevious, но я не уверен, что понимаю, как подключить их к событию, инициированному пользователем, взаимодействующим с виджетом.Кто-нибудь может привести примеры, когда эти методы могут быть вызваны?

Похоже, что кнопки в виджетах могут быть подключены только к намерениям, а не к коду для отработки флиппера.Если это ограничение верно, то является ли использование флиппера только в виджете приложения для автоматического переключения видов?

1 Ответ

8 голосов
/ 29 декабря 2011

Скажем, у вас есть 2 кнопки: ВЛЕВО и ВПРАВО.Сначала вы прикрепите ожидающее намерение к каждому (здесь оно вызывается из Service#onStart:

@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;
}

Затем в AppWidgetProvider do

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

Это должно сделать это. Теперь проблемаэто - это будет работать только в API 11+, и я только что нашел сложный способ, которым root.setInt(R.id.scroll, "setDisplayedChild", pos) не будет работать в API 7.

...