2015-09-01 5 views
0

У меня есть приложение, которое должно изменить разные макеты для виджета, в зависимости от размера, например, если виджет - это ячейки 4x2, тогда настройте widget_layout, esle настройте widget_layout1.обновить виджет с несколькими макетами

Для этого изменения я использую @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 partialUpdateAppWidget (int appWidgetId, ViewViewViews), что «Обратите внимание, что поскольку эти обновления не кэшируются, любое состояние, которое они изменяют, которое не восстанавливается функцией restoreInstanceState, не будет сохраняться в случае восстановления виджетов используя кешированную версию в AppWidgetService. "

E.g. если вы измените что-то (не все) в своем виджете через RemoteView, вызовите updateAppWidget и поверните экран, то Widget восстановит только данные, добавленные в виджет перед вызовом updateAppWidget. Все остальные данные будут потеряны.

Смежные вопросы