2013-06-16 2 views
6

Я создаю виджет для своего приложения для Android, на котором будет несколько кнопок. Основываясь на размере виджета, я хочу, чтобы количество кнопок на виджета увеличивалось и сокращалось. Это то, что в настоящее время он выглядит в представлении 4x1: 4x1 widgetИзменение размера виджета Android

И когда вы уменьшите его до 3x1: 3x1

Есть в любом случае, чтобы динамически скрыть 4th кнопку в окне 3x1, так что остальные 3 Кнопки не сжимаются? То же самое можно сделать для 2x1 или 1x1. Любой вход на это был бы очень признателен!

Спасибо!

+1

Вы разрабатываете правила человека! – Piovezan

+1

Ха-ха, спасибо! – BarryBostwick

ответ

0

Вы можете попробовать слушать обратный вызов onAppWidgetOptionsChanged: он должен срабатывать при изменении размера макета. Тем не менее, я действительно не видел (сейчас), чтобы определить фактическое количество экранной недвижимости, которую занимает ваш виджет, поэтому нет хорошего способа изменить видимость кнопок на основе размера.

4

С версии 4.1 (api level 16) появилась новая функция getAppWidgetOptions(), которая возвращает Bundle с некоторыми параметрами калибровки. См. here. Возможно, вы можете использовать это для того, что вам нужно, но afaik нет аналогичного варианта для версий ниже 4.1.

8

Как было предложено, у вас нет другого способа, кроме как реализовать onAppWidgetOptionsChanged у вашего поставщика виджета - уровень API < У 16 пользователей этой функции пока не будет.

Чтобы скрыть кнопки при уменьшении виджета, ваш виджет должен вести себя аналогично виджету погоды, приведенному в качестве примера на сайте Android Design, в соответствии с шаблоном «Widgets» (фактически на самом деле приложения). Вы показываете меньше кнопок, когда виджет сжимается, увеличивается количество кнопок, увеличивая видимость кнопок.

enter image description here

В onAppWidgetOptionsChanged, используя значения, приведенные в NewOptions Bundle, вы должны обнаружить изменения в ширину и высоту и установить ведра размер, как советовали в документации (из того же дизайна страницы):

Фактически, поскольку пользователь изменяет размер виджета, система ответит диапазоном размеров dp ​​ , в котором ваш виджет может перерисовать себя. Планирование стратегии изменения размера виджета по «размерным ковшикам», а не переменной Размеры сетки дадут вам самые надежные результаты.

Что действительно сложное - Как определить эти ведра. Пакет newOptions имеет значения min_width, min_height, max_width и max_height, которые существенно различаются между устройствами, плотностью экрана, пусковыми установками и т. Д. К сожалению, команда Android не показывала нам, как это сделать, и есть несколько примеров кода onAppWidgetOptionsChanged в сети, большинство из них очень просты.

8

Как они уже говорили. Вы можете использовать onAppWidgetOptionsChanged

Так что мое предложение заключается в

1) Сделайте различные макеты. С 3 и 4 кнопками.

2) Измените базу макета на подсчет столбца виджета.

@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

Это должен быть принятый ответ –

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