2013-07-01 3 views
6

Устройства, такие как Samsung Galaxy S3, работающие с Android версии 4.1.2, имеют ошибку, которая запрещает вызывать onAppWidgetOptionsChanged.Как уловить изменения размера виджета на устройствах, где onAppWidgetOptionsChanged не получает вызов?

Итак, как мы можем получить информацию, связанную с измененными размерами?

ответ

4

Я обнаружил, что вы можете поймать действие RESIZE в функции onReceive.

if(intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) 

Вы получите следующие значения из getExtras этого намерения (в) расслоение:

int appWidgetId = bundle.getInt("widgetId"); // bundle.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); 


int widgetSpanX = bundle.getInt("widgetspanx", 4); 
int widgetSpanY = bundle.getInt("widgetspany", 1); 

Теперь вы можете использовать эти значения, чтобы обновить представление или сохранить их в статической переменном целом карты использовать в следующем onUpdate.

+0

«или сохранить их в статической целочисленной переменной карты» - это не будет надежным, так как ваш процесс может быть завершен между трансляцией 'com.sec.android.widgetapp.APPWIDGET_RESIZE' и любым последующим' onUpdate() 'звонок. Теперь может показаться, что модифицированный код Samsung инициирует 'onUpdate()' очень скоро после 'com.sec.android.widgetapp.APPWIDGET_RESIZE', и в этом случае статические члены данных могут работать на практике. – CommonsWare

+0

@CommonsWare спасибо, вы можете быть правы. Он не запускает onUpdate автоматически, поэтому я транслирую обновление, если новый размер не тот, который я сохранил в статической переменной. Для статической переменной: приложение автоматически запускается для вызова onReceive, поэтому оно всегда будет устанавливать статическую переменную. Если он будет убит в этот момент, это, вероятно, вызвано сбоем, и он не должен сбой в любом случае. В противном случае мы не сможем обновить виджет. Я что-то упускаю? : | Кстати, мы всегда можем сделать прямое обновление от onreceive-функции, если нам все равно, размер такой же или нет. – frankish

10

Я добавляю к ответу франкского с как я ручка получать эту передачу:

@Override 
public void onReceive(Context context, Intent intent) { 
    // Handle TouchWiz 
    if(intent.getAction().contentEquals("com.sec.android.widgetapp.APPWIDGET_RESIZE")) { 
     handleTouchWiz(context, intent); 
    } 
    super.onReceive(context, intent); 
} 

private void handleTouchWiz(Context context, Intent intent) { 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 

    int appWidgetId = intent.getIntExtra("widgetId", 0); 
    int widgetSpanX = intent.getIntExtra("widgetspanx", 0); 
    int widgetSpanY = intent.getIntExtra("widgetspany", 0); 

    if(appWidgetId > 0 && widgetSpanX > 0 && widgetSpanY > 0) { 
     Bundle newOptions = new Bundle(); 
     // We have to convert these numbers for future use 
     newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT, widgetSpanY * 74); 
     newOptions.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, widgetSpanX * 74); 

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

Вы, возможно, потребуется изменить, как вы справляетесь, что сверток, если вы используете MAX_HEIGHT или MAX_WIDTH, которые я не являюсь.

+0

Так как вы тот, кто управляет действием, разве вы не должны называть «super.onReceive» в этом случае? –

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