2013-06-16 7 views
6

Ich baue ein Widget für meine Android-Anwendung, die mehrere Tasten darauf haben wird. Basierend auf der Größe des Widgets möchte ich die Anzahl der Schaltflächen auf dem Widget vergrößern und verkleinern. Dies ist, was es sieht aus wie zur Zeit in einer 4x1-Ansicht: 4x1 widgetAndroid Widget Größe ändern

Und wenn Sie es 3x1 schrumpfen: 3x1

Gibt es trotzdem dynamisch die vierte Taste in der 3x1 zu verstecken, so dass die andere 3 Knöpfe werden nicht zerquetscht? Dasselbe würde für ein 2x1 oder 1x1 gehen. Irgendwelche Eingaben dazu würden sehr geschätzt werden!

Danke!

+1

Sie entwerfen Regeln Mann! – Piovezan

+1

Haha danke! – BarryBostwick

Antwort

0

Sie können versuchen, den Rückruf onAppWidgetOptionsChanged zu hören: Dieser sollte ausgelöst werden, wenn sich die Layoutgröße ändert. Es gibt jedoch keine Möglichkeit, die tatsächliche Größe der Bildschirmfläche zu bestimmen, die Ihr Widget belegt. Daher gibt es keine gute Möglichkeit, die Sichtbarkeit der Schaltfläche basierend auf der Größe zu ändern.

4

Ab Version 4.1 (api level 16) gibt es eine neue Funktion getAppWidgetOptions(), die ein Bundle mit einigen Parametern zurückgibt. Siehe here. Vielleicht können Sie das für das verwenden, was Sie brauchen, aber afaik gibt es keine ähnliche Option für Versionen unter 4.1.

8

Wie vorgeschlagen wurde, haben Sie keine andere Möglichkeit als onAppWidgetOptionsChanged in Ihrem Widget-Provider zu implementieren - API-Ebene < 16 Benutzer werden diese Funktion leider nicht haben.

Um die Schaltflächen beim Verkleinern des Widgets auszublenden, muss sich Ihr Widget ähnlich wie das Wetterwidget verhalten, das als Beispiel in der Android Design-Site unter "Widgets" (appwidgets) angegeben ist. Sie zeigen weniger Schaltflächen, wenn das Widget verkleinert wird, mehr Schaltflächen, wenn es größer wird, und legen die Sichtbarkeit der Schaltflächen fest.

enter image description here

In onAppWidgetOptionsChanged, die Werte von der newOptions Bundle gegeben verwenden, müssen Sie die Änderung in Breite und Höhe erfassen und einstellen Größe Eimer wie in der Dokumentation empfohlen (von der gleichen Design-Seite):

Wenn der Benutzer ein Widget in der Größe ändert, antwortet das System mit einem dp-Größenbereich, in dem sich Ihr Widget neu zeichnen kann. Planen Sie Ihre Widget Resizing-Strategie über "Größe Buckets" anstatt Variable Gitter Abmessungen geben Ihnen die zuverlässigsten Ergebnisse.

Was wirklich herausfordernd ist , wie diese Eimer bestimmen. Das newOptions-Bundle hat die Werte min_width, min_height, max_width und max_height, die sich bei Geräten, Bildschirmdichten, Launchern usw. stark unterscheiden. Leider hat uns das Android-Team nicht gezeigt, wie das geht, und es gibt nur wenige Codebeispiele von onAppWidgetOptionsChanged im Web. Die meisten von ihnen sind sehr einfach.

8

Wie sie schon gesagt haben. Sie können verwenden onAppWidgetOptionsChanged

Also mein Vorschlag

1) Stellen Sie verschiedene Layouts zu

ist. Mit 3 und 4 Tasten.

2) Ändern Sie die Layout-Basis für die Anzahl der Widget-Spalten.

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
@Override 
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { 

    // 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 row or column 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); 
    // Now you changing layout base on you column count 
    // In this code from 1 column to 4 
    // you can make code for more columns on your own. 
    switch (column) { 
     case 1: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_1column); 
     case 2: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_2column); 
     case 3: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_3column); 
     case 4: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_4column); 
     default: return new RemoteViews(context.getPackageName(), R.layout.activity_layout_widget_4column); 
    } 
} 

/** 
* 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) { 
    int n = 2; 
    while (70 * n - 30 < size) { 
     ++n; 
    } 
    return n - 1; 
} 
+1

Dies sollte die akzeptierte Antwort sein –