2013-07-01 4 views

Antwort

4

Ich habe festgestellt, dass Sie die RESIZE-Aktion in der onReceive-Funktion abfangen können.

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

Hier finden Sie die folgenden Werte aus dieser Absicht des getExtras() Bundle:

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

Jetzt können Sie diese Werte verwenden, können Sie die Ansicht oder speichern sie in einer statischen Integer-Karte Variable aktualisieren zu verwenden im nächsten OnUpdate.

+0

"oder speichern Sie sie in einer statischen Integer-Map-Variable" - dies wird nicht zuverlässig sein, da Ihr Prozess zwischen der 'com.sec.android.widgetapp.APPWIDGET_RESIZE' Broadcast und jedem nachfolgenden' onUpdate() beendet werden kann Ruf an. Nun kann es funktionieren, dass Samsungs modifizierter Code eine 'onUpdate()' sehr kurz nach 'com.sec.android.widgetapp.APPWIDGET_RESIZE' auslöst, in welchem ​​Fall statische Datenmitglieder in der Praxis funktionieren. – CommonsWare

+0

@CommonsWare danke, Sie können Recht haben. Es wird OnUpdate nicht automatisch ausgelöst, daher sende ich ein Update, wenn die neue Größe nicht die gleiche ist, die ich in der statischen Variable gespeichert habe. Für die statische Variable: App wird automatisch gestartet, um onReceive aufzurufen. Daher wird diese statische Variable immer festgelegt. Wenn es zu diesem Zeitpunkt getötet wird, ist es wahrscheinlich durch einen Absturz verursacht und es sollte sowieso nicht abstürzen .. andernfalls können wir das Widget nicht aktualisieren. Fehle ich etwas? : | Übrigens können wir immer direkt von der Empfangsfunktion updaten, wenn es uns egal ist, ob die Größe gleich ist oder nicht. – frankish

10

Ich füge zu fränkischer Antwort mit, wie ich diese Sendung Griff Empfang:

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

Möglicherweise müssen Sie ändern, wie Sie dieses Bündel handhaben, wenn Sie MAX_HEIGHT oder MAX_WIDTH verwenden, die ich nicht bin.

+0

Da Sie derjenige sind, der die Aktion bearbeitet, sollten Sie nicht vermeiden, in diesem Fall "super.onReceive" aufzurufen? –

Verwandte Themen