Android 4.1 Jelly Beanのウィジェットのサイズ変更

既知のとおり、新しいバージョンのAndroid Jelly Bean(API v16)にはウィジェットのサイズを変更する機能があり、ウィジェットを変更するだけでなく、自動的に画面上の空きスペースに合わせて調整します。

この関数は便利で便利ですが、公式ドキュメントにはほとんど何もありませんが、これはかなり奇妙です。



いくつかのウィジェットを開発しているため、この機能を追加することにしました。





最初に気づいたのは、ウィジェットのサイズがまったく変わらないことです。これは、widget_provider.xml(res / xml)に3行追加するだけで決定されました。



android:resizeMode="horizontal|vertical" android:minResizeHeight="72dip" android:minResizeWidth="72dip"
      
      





android:resizeModeは、ウィジェットのサイズ変更の方向を担当し、3つの可能な値を持ちます。



android:minResizeHeightおよびandroid:minResizeWidthは、設定可能な最小ウィジェットサイズを担当します。

上記のコードでは、ウィジェットは任意の方向に引き伸ばすことができ、その最小サイズは1 * 1セルです。



すべてが優れたものになり、すべてが機能しているように見えますが、ウィジェットがどのサイズになったかは明らかではありません。

onAppWidgetExtrasChangedメソッド(コンテキストコンテキスト、AppWidgetManager appWidgetManager、int appWidgetId、Bundle newExtras)のドキュメントで、サイズ変更時に呼び出す必要のある記述を見つけましたが、 呼び出しませんでした。

次に、ウィジェットのサイズが変更されると、新しいブロードキャスト「 android.appwidget.action.APPWIDGET_UPDATE_OPTIONS 」が送信されることが判明しました。 ロジックに従って、新しいサイズがそれに合うと仮定することができます。 そしてそれが判明した。

しかし、彼は非常に明確な形で送られていません。 結果はこのコードです:



  final String action = intent.getAction(); if (action.equalsIgnoreCase("android.appwidget.action.APPWIDGET_UPDATE_OPTIONS")) { Bundle b = intent.getBundleExtra("appWidgetOptions"); int appWidgetMinWidth = (Integer) b.get("appWidgetMinWidth")/80; // int appWidgetMaxWidth = (Integer) b.get("appWidgetMaxWidth"); // int appWidgetMinHeight = (Integer) b.get("appWidgetMinHeight"); int appWidgetMaxHeight = (Integer) b.get("appWidgetMaxHeight")/100; Log.i("Widget","Width="+appWidgetMinWidth+" Height="+appWidgetMaxHeight);
      
      





4つのサイズが送信されます-最小および最大の幅と高さ。 実験中、これらの寸法は一定であり、最小幅と最大高さに焦点を合わせる方が便利であることが判明しました。

ウィジェットのサイズを変更すると、セル数のサイズがログに表示されます。 さらに、このウィジェット用にこのサイズを保存し(ID:int id = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID、AppWidgetManager.INVALID_APPWIDGET_ID);)、更新時にこのデータを読み取り、パラメーターを調整します。



もちろん、Androidの以前のバージョンでは、そのような機能はなく、私を含む多くの開発者は、人々に選択肢を与えるためにいくつかのウィジェットサイズを作成しましたが、この選択は不要になりました。ウィジェットとズーム機能、および以前のバージョンのユーザーにはサイズの異なる複数のウィジェットがありますが、これらはすべて1つのパッケージに含まれています。

実装が非常に簡単であることが判明しました。

res / valuesフォルダー内のコンテンツでbool.xmlファイルを作成します



 <resources> <bool name="v16">true</bool> </resources>
      
      





また、res / values-v16フォルダーには同じファイルがありますが、他のコンテンツもいくつかあります。



 <resources> <bool name="v16">false</bool> </resources>
      
      





次に、AndroidManifest.xmlで、新しいバージョンで非表示にする必要があるウィジェットレシーバーを追加します

 android:enabled="@bool/v16"
      
      





そして、API v16以降、これらのウィジェットは無効になり、リストに表示されなくなります。



PSこのメソッドは、MDPIおよびHDPI画面で、ランチャー4 * 4のグリッドのサイズ、Android Jelly Beanを搭載したタブレットのユーザーの要求、およびメソッドをチェックするための4 * 4より大きいグリッドのサイズでテストされました。



All Articles