2015-09-01 68 views
0

我有一个应用程序需要更改不同的小部件布局,取决于大小,例如,如果小部件是4x2单元,然后设置widget_layout,esle设置widget_layout1。更新小部件与多个布局

对于这个变化我用@ Gogu的method

@Override 
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { 

    Log.d("widget", "Changed dimensions"); 

    // See the dimensions and 
    Bundle options = appWidgetManager.getAppWidgetOptions(appWidgetId); 

    // Get min width and height. 
    int minWidth = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH); 
    int minHeight = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT); 

    // Obtain appropriate widget and update it. 
    appWidgetManager.updateAppWidget(appWidgetId, getRemoteViews(context, minWidth, minHeight)); 

    super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); 
} 

/** 
* Determine appropriate view based on width provided. 
* 
* @param minWidth 
* @param minHeight 
* @return 
*/ 
private RemoteViews getRemoteViews(Context context, int minWidth, int minHeight) { 

    // First find out rows and columns based on width provided. 
    int rows = getCellsForSize(minHeight); 
    int columns = getCellsForSize(minWidth); 

    Log.d("dinazaur coloane", "nr este: " + columns); 
    Log.d("dinazaur randuri", "nr este: " + rows); 


    if (columns == 4) { 
     // Get 4 column widget remote view and return 
     return new RemoteViews(context.getPackageName(), 
       R.layout.simple_widget); 
    } else { 
     // Get appropriate remote view. 
     return new RemoteViews(context.getPackageName(), 
       R.layout.simple_widget2); 
    } 
} 

/** 
* Returns number of cells needed for given size of the widget. 
* 
* @param size Widget size in dp. 
* @return Size in number of cells. 
*/ 
private static int getCellsForSize(int size) { 
    return (int) (Math.ceil(size + 30d)/70d); 
} 

我不明白为什么改变控件布局尺寸后(得到它更大 - >更改layout_simple1再小一些改变,以layout_simple回),onUpdate()方法处理的onClick的PendingIntent为layout_simple不工作的话(甚至不叫),代码:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
    final int count = appWidgetIds.length; 

    for (int i = 0; i < count; i++) { 
     int widgetId = appWidgetIds[i]; 
     String number = String.format("%03d", (new Random().nextInt(900) + 100)); 

     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.simple_widget); 
     remoteViews.setTextViewText(R.id.textView, number); 

     Intent intent = new Intent(context, SimpleWidgetProvider.class); 
     intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
     intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); 

     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     remoteViews.setOnClickPendingIntent(R.id.actionButton, pendingIntent); 
     appWidgetManager.updateAppWidget(widgetId, remoteViews); 


    } 
} 

我的窗口小部件的XML是:

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:initialLayout="@layout/simple_widget" 
    android:minHeight="60dp" 
    android:minWidth="120dp" 
    android:resizeMode="horizontal|vertical" 
    android:updatePeriodMillis="1800000" 
    android:widgetCategory="home_screen|keyguard"> 

</appwidget-provider> 

回答

0

您需要在updateAppWidget调用之前重新分配您的OnClickPendingIntent。注意说明public void partiallyUpdateAppWidget(int appWidgetId,RemoteViews视图)“请注意,因为这些更新没有被缓存,所以它们修改的任何状态都不会被restoreInstanceState恢复,在这些小部件被恢复的情况下将不会持续使用AppWidgetService中的缓存版本“。

例如,如果您通过RemoteView更改widget上的某些内容(不是全部),调用updateAppWidget并旋转屏幕,则Widget将只会恢复在updateAppWidget调用之前添加到该widget的数据。所有其他数据将丢失。