2013-06-16 18 views
6

Androidアプリケーション用のウィジェットがいくつか作成されていますが、いくつかのボタンがあります。ウィジェットのサイズに基づいて、ウィジェットのボタンの量を増減させたいと思います。これは、現在4x1のビューで次のようになります。 4x1 widgetAndroidウィジェットのサイズ変更

そして、あなたは3×1にそれを縮小: 3x1

は、動的に他の3 SO 3×1ビューにおける第四ボタンを非表示にするには、とにかくはありますボタンが押しつぶされない?同じ2x1または1x1のために行くだろう。これに関するすべての入力は非常に高く評価されます!

ありがとうございます!

+1

ルールマン! – Piovezan

+1

ハハありがとう! – BarryBostwick

答えて

0

onAppWidgetOptionsChangedコールバックを聞くことができます。レイアウトサイズが変わるたびに発生するコールバックです。しかし、あなたのウィジェットが占めるスクリーンの不動産の実際の量を判断する方法は今のところありません。したがって、サイズに基づいてボタンの可視性を変更する良い方法はありません。

4

バージョン4.1(APIレベル16)には、いくつかのサイジングパラメータを含むバンドルを返す新しい関数getAppWidgetOptions()があります。 hereを参照してください。多分あなたはあなたが必要とするもののためにそれを使うことができますが、afaikには4.1より下のバージョンの似たようなオプションはありません。

8

あなたのウィジェットプロバイダにonAppWidgetOptionsChangedを実装する以外の方法はありません - APIレベル<ユーザーはこの機能を残念ながら持たないでしょう。

ウィジェットが縮小するときにボタンを隠すために、あなたのウィジェットは、Androidデザインサイトの例として天気ウィジェットと同様に、パターン "Widgets"(実際にはappwidgets)で動作する必要があります。ウィジェットが縮小するにつれて、より多くのボタンが表示され、ボタンが大きくなるとボタンの可視性が設定されます。 newOptionsバンドルによって与えられた値を使用してonAppWidgetOptionsChanged

enter image description here

、あなたは、幅と高さの変化を検出し、(同じデザインのページから)ドキュメントに助言としてサイズバケット設定する必要があります。

実際、ユーザーがウィジェットのサイズを変更すると、システムは dpサイズの範囲で応答し、ウィジェットはそれ自身を再描画できます。変数 のグリッド寸法ではなく、「サイズバケット」にわたる ウィジェットのサイズ変更戦略を計画すると、最も信頼性の高い結果が得られます。

本当に挑戦的なのは、バケットの決定方法です。 newOptions Bundleは、デバイス、画面の密度、ランチャーなどの間で大きく異なるmin_width、min_height、max_width、max_heightの値を持っています。残念ながら、Androidチームはこれを行う方法を教えてくれなかったし、onAppWidgetOptionsChanged、それらのほとんどは非常に簡単です。

8

彼らはすでに言ったように。あなたはは、だから私の命題は

1)異なるレイアウトを作ることです

をonAppWidgetOptionsChanged使用することができます。 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

これは受け入れられる回答である必要があります –

関連する問題