ViewFlipper in app widgets

后端 未结 1 1740
时光取名叫无心
时光取名叫无心 2021-01-01 02:34

I\'m playing around building a new widget and was looking at the Android app widget documentation, in particular the section on which widget classes were supported. I notic

1条回答
  •  一生所求
    2021-01-01 03:06

    Say you have 2 buttons: LEFT and RIGHT. First you would attach pending intent to each (here it's triggered from 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;
    }
    

    Then, in 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);
    }
    

    This should do it. Now the problem is - this will only work in API 11+ and I just found the hard way that root.setInt(R.id.scroll, "setDisplayedChild", pos) will not work in API 7.

    0 讨论(0)
提交回复
热议问题