アプリ用のAndroidウィジェットを作成する

著者: Lewis Jackson
作成日: 13 5月 2021
更新日: 1 J 2024
Anonim
【Android】ウィジェットでホーム画面をカスタマイズ!他と差をつけろ!|スマホ比較のすまっぴー
ビデオ: 【Android】ウィジェットでホーム画面をカスタマイズ!他と差をつけろ!|スマホ比較のすまっぴー

コンテンツ


OSの初期の頃から、Android用のウィジェットにより、ユーザーはホーム画面の快適さからお気に入りのアプリを操作できます。では、Androidウィジェットをどのように作成しますか?

開発者にとって、ウィジェットはアプリケーションをユーザーのホーム画面上で貴重な存在感を与えます。アプリの引き出しに隠れてしまうのではなく、ユーザーにアプリについて思い出させる 毎回 ユーザーはホーム画面を見るだけでなく、アプリの最も興味深く有用なコンテンツのプレビューも取得します。

ウィジェットは、ユーザーのホーム画面上でアプリケーションに貴重な存在感を与えます

この記事では、Androidウィジェットを作成して、ユーザーがアプリを使用するように促しながら、ユーザーエクスペリエンスを向上させる方法を紹介します。この記事の終わりまでに、ユーザーのホーム画面に完全なデータセットを表示するスクロール可能なコレクションウィジェットを作成します。

ユーザーが使用するウィジェットの種類を確実に提供するために 欲しいです ホーム画面に配置するために、構成アクティビティも作成します。これにより、ユーザーはウィジェットのコンテンツ、外観、機能をカスタマイズできます。最後に、ウィジェットが提供する最高の機能を紹介するウィジェットプレビュー画像を作成することで、ユーザーにウィジェットの使用を促す方法を示します。

また読む: 折りたたみ可能なデバイス向けの開発:知っておくべきこと

Android用のウィジェットとは何ですか?

アプリケーションウィジェットは、ユーザーのホーム画面に表示される軽量で小型のアプリケーションです。

Android向けのウィジェットはさまざまなコンテンツを提供できますが、通常は次のカテゴリのいずれかに分類されます。

  • 情報ウィジェット。これはスクロールできないウィジェットで、今日の天気予報や日時などの情報を表示します。
  • コレクションウィジェット。これは、ListView、GridView、StackView、またはAdapterViewFlipperとしてフォーマットされた関連データのセットを表示するスクロール可能なウィジェットです。コレクションウィジェットは通常、データベースや配列などのデータソースによってサポートされます。
  • ウィジェットを制御する。これらのウィジェットは、ユーザーがアプリケーションと対話できるようにするリモートコントロールとして機能し、 なしで フォアグラウンドに持ってくる必要があります。ポッドキャストや音楽などのメディアを再生するアプリには、多くの場合、ユーザーがホーム画面から直接再生、一時停止、およびスキップアクションをトリガーできるコントロールウィジェットがあります。
  • ハイブリッドウィジェット。複数のカテゴリの要素を組み合わせることで、より優れたユーザーエクスペリエンスを提供できる場合があります。たとえば、音楽アプリケーション用のコントロールウィジェットを開発している場合、再生、一時停止、スキップの各コントロールを提供できますが、曲のタイトルやアーティストなどの情報を表示することもできます。ミックスしてマッチすることに決めたなら、夢中にならないでください!ウィジェットは、タイムリーで関連性のある少量の情報または一般的に使用されるいくつかの機能に簡単にアクセスできる場合、最高のユーザーエクスペリエンスを提供する傾向があります。ハイブリッドウィジェットを軽量に保つために、ウィジェットの主要なカテゴリを特定し、そのカテゴリに従って開発することをお勧めします。 それから ウィジェットのセカンダリカテゴリからいくつかの要素を追加します。

私のプロジェクトには本当にアプリケーションウィジェットが必要ですか?

Androidプロジェクトにアプリケーションウィジェットを追加することを検討する理由はいくつかあります。


Android用のウィジェットはユーザーエクスペリエンスを向上させることができます

一般的なルールとして、タスクを完了するために必要なナビゲーション手順が少ないほど、ユーザーエクスペリエンスが向上します。

アプリケーションウィジェットを提供することで、アプリで最もよく使用されるフローから複数のナビゲーションステップを削除できます。最良のシナリオでは、ユーザーはホーム画面を見るだけで必要な情報を取得するか、コントロールウィジェットのボタンをタップするだけで目的のタスクを実行できます。

アプリケーションのショートカットよりも強力

多くの場合、アプリのウィジェットは、アプリケーションのショートカットと同様に、関連付けられたアプリケーションの最上位を起動することでonClickイベントに応答します。ただし、ウィジェットは、アプリケーション内の特定のアクティビティへの直接アクセスも提供できます。たとえば、ウィジェットの新しい受信通知をタップすると、新しいアプリが既に開いている状態で関連アプリが起動します。

ウィジェットのレイアウトに複数のリンクを埋め込むことで、アプリの最も重要なアクティビティすべてにワンタップでアクセスできるようになり、最もよく使用されるフローからさらにナビゲーション手順を削除できます。

ウィジェットのレイアウトに複数のリンクを埋め込むことで、アプリの最も重要なアクティビティすべてにワンタップでアクセスできます。

ウィジェットはonClickイベントにのみ応答することに注意してください。これにより、ユーザーがホーム画面をスワイプしているときに誤ってウィジェットを操作することを防ぎます。唯一の例外は、ユーザーがウィジェットをホーム画面の[削除]アクションにドラッグしてウィジェットを削除しようとした場合です。このシナリオでは、ウィジェットは垂直スワイプジェスチャに応答します。

この相互作用はAndroidシステムによって管理されるため、ウィジェットで垂直方向のスワイプサポートを手動で実装する必要はありません。


長期的なエンゲージメントを促進するAndroidウィジェットを作成する

アプリをダウンロードするように人々を説得することは、成功するAndroidアプリケーションを作成するための最初のステップにすぎません。自分のAndroidスマートフォンまたはタブレットをつかんでアプリの引き出しをスワイプすると、数日、数週間、場合によっては数か月も使用していない複数のアプリが見つかる可能性があります。

また読む:Facebook for Android SDKの使用を開始する

アプリがユーザーのデバイスに正常にインストールされたら、ユーザーを引き付けてアプリを楽しんでもらうために努力する必要があります。ホーム画面にアプリを表示することは、アプリが存在することを常に思い出させるという理由だけで、長期的なエンゲージメントを促進する強力なツールになります。

適切に設計されたウィジェットは、アプリの継続的な広告としても機能します。ユーザーがホーム画面を見るたびに、ウィジェットには、アプリの最も興味深く有用なコンテンツをすべて表示することで、アプリとの再エンゲージメントを積極的に促す機会があります。

コレクションアプリウィジェットの作成

このチュートリアルでは、スクロール可能なListViewとして配列を表示するコレクションウィジェットを構築します。

アプリウィジェットのライフサイクルを追跡しやすくするために、このウィジェットは、さまざまなライフサイクル状態を移動するときにさまざまなトーストをトリガーします。このチュートリアルの最後に向けて、Androidのウィジェットピッカーに表示されるカスタムプレビューイメージと、ユーザーがホーム画面に配置する前にウィジェットをカスタマイズできるようにする構成アクティビティで、ウィジェットを強化します。

選択した設定で新しいAndroidプロジェクトを作成し、始めましょう!

ウィジェットのレイアウトを構築する

まず、ウィジェットのユーザーインターフェース(UI)を定義しましょう。

アプリケーションウィジェットはプロセスに表示されます 外側 アプリケーション。したがって、RemoteViewsでサポートされているレイアウトとビューのみを使用できます。

レイアウトを作成するときは、次のものに制限されます。

  • アナログ時計
  • ボタン
  • クロノメーター
  • FrameLayout
  • グリッドレイアウト
  • ImageButton
  • ImageView
  • LinearLayout
  • プログレスバー
  • RelativeLayout
  • TextView
  • ViewStub
  • AdapterViewFlipper
  • グリッドビュー
  • リストビュー
  • StackView
  • ViewFlipper

上記のクラスとビューのサブクラスは じゃない サポートされています。

list_widget.xmlという名前の新しいレイアウトリソースファイルを作成します。 ListViewを使用してデータを表示するため、このレイアウトは主に、 素子:

コレクションウィジェットの入力

次に、ListViewのデータプロバイダーを作成する必要があります。 DataProvider.javaという名前の新しいJavaクラスを作成し、次を追加します。

import android.content.Context; import android.content.Intent; import android.widget.RemoteViews; import android.widget.RemoteViewsService; import java.util.ArrayList; import java.util.List; import static android.R.id.text1; import static android.R.layout.simple_list_item_1;パブリッククラスDataProviderはRemoteViewsService.RemoteViewsFactoryを実装します{List myListView = new ArrayList <>();コンテキストmContext = null; public DataProvider(Context context、Intent intent){mContext = context; } @override public void onCreate(){initData(); } @override public void onDataSetChanged(){initData(); } @Override public void onDestroy(){} @Override public int getCount(){return myListView.size(); } @Override public RemoteViews getViewAt(int position){RemoteViews view = new RemoteViews(mContext.getPackageName()、simple_list_item_1); view.setTextViewText(text1、myListView.get(position));戻りビュー; } @Override public RemoteViews getLoadingView(){nullを返す。 } @override public int getViewTypeCount(){return 1; } @Override public long getItemId(int position){位置を返す; } @Override public boolean hasStableIds(){trueを返します。 } private void initData(){myListView.clear(); for(int i = 1; i <= 15; i ++){myListView.add( "ListView item" + i); }}}

AppWidgetProvider:ウィジェットの構成

Androidウィジェットを作成するには、いくつかのファイルを作成する必要があります。

最初のウィジェット固有のファイルはAppWidgetProviderです。これは、ウィジェットが最初に作成されたときに呼び出されるメソッドや、ウィジェットが最終的に削除されたときに呼び出されるメソッドなど、さまざまなウィジェットライフサイクルメソッドを定義するBroadcastReceiverです。

CollectionWidgetという名前の新しいJavaクラス(ファイル>新規> Javaクラス)を作成します。

開始するには、すべてのウィジェットプロバイダーファイルをAppWidgetProviderクラスから拡張する必要があります。次に、list_widget.xmlレイアウトリソースファイルをRemoteViewsオブジェクトにロードし、更新されたRemoteViewsオブジェクトについてAppWidgetManagerに通知する必要があります。

パブリッククラスCollectionWidgetはAppWidgetProviderを拡張します{static void updateAppWidget(Context context、AppWidgetManager appWidgetManager、int appWidgetId){// RemoteViewsオブジェクトをインスタンス化する// RemoteViewsビュー= new RemoteViews(context.getPackageName()、R.layout.list_widget); setRemoteAdapter(context、views); // AppWidgetManagerがアプリケーションウィジェットを更新することを要求します// appWidgetManager.updateAppWidget(appWidgetId、views); }

アダプターを作成する

ListViewでデータを表示しているため、AppWidgetProviderでsetRemoteAdapter()メソッドを定義する必要があります。 setRemoteAdapter()はAbsListView.setRemoteViewsAdapter()を呼び出すことと同等ですが、アプリケーションウィジェットで使用されるように設計されています。

このメソッドでは、AdapterView(R.id.widget_list)のidと、最終的にRemoteViewsAdapterにデータを提供するサービスの意図を定義する必要があります。このWidgetServiceクラスをまもなく作成します。

private static void setRemoteAdapter(Context context、@NonNull final RemoteViews views){views.setRemoteAdapter(R.id.widget_list、new Intent(context、WidgetService.class)); }}

ウィジェットのライフサイクルメソッドの定義

AppWidgetProviderでは、次のウィジェットライフサイクルメソッドも定義する必要があります。

onUpdateを使用して新しいコンテンツを取得する

onUpdate()ウィジェットライフサイクルメソッドは、ウィジェットのビューを新しい情報で更新します。

このメソッドは毎回呼び出されます:

  • ユーザーがonUpdate()メソッドを手動でトリガーするアクションを実行します。
  • アプリケーションの指定された更新間隔が経過しました。
  • ユーザーは、このウィジェットの新しいインスタンスをホーム画面に配置します。
  • ACTION_APPWIDGET_RESTOREDブロードキャストインテントがAppWidgetProviderに送信されます。このブロードキャストインテントは、ウィジェットがバックアップから復元されるとトリガーされます。

これは、ウィジェットが使用するイベントハンドラーを登録する場所でもあります。

Androidウィジェットを更新する場合、ユーザーは同じウィジェットの複数のインスタンスを作成できることに注意することが重要です。たとえば、ウィジェットはカスタマイズ可能であり、ユーザーは異なる情報を表示する複数の「バージョン」を作成するか、独自の機能へのアクセスを提供するかを決定します。

onUpdate()を呼び出すとき、このウィジェットのすべてのインスタンスを更新するか、特定のインスタンスのみを更新するかを指定する必要があります。すべてのインスタンスを更新する場合は、appWidgetIdsを使用できます。appWidgetIdsは、デバイス全体のすべてのインスタンスを識別するIDの配列です。

次のスニペットでは、すべてのインスタンスを更新しています。

@Override public void onUpdate(Context context、AppWidgetManager appWidgetManager、int appWidgetIds){for(int appWidgetId:appWidgetIds){//このウィジェットのすべてのインスタンスを更新// updateAppWidget(context、appWidgetManager、appWidgetId)); } super.onUpdate(context、appWidgetManager、appWidgetIds); }

コードをわかりやすくするため、このonUpdate()メソッドは現在ウィジェットに変更を加えていないことに注意してください。

onEnabled:初期セットアップの実行

onEnabled()ライフサイクルメソッドは、ACTION_APPWIDGET_ENABLEDに応答して呼び出されます。これは、ウィジェットのインスタンスがホーム画面に追加されたときに送信されます 最初 時間。ユーザーがウィジェットの2つのインスタンスを作成すると、onEnabled()は最初のインスタンスに対して呼び出されますが、 じゃない 2番目の。

onEnabled()ライフサイクルメソッドは、ウィジェット情報を提供するデータベースの作成など、ウィジェットのすべてのインスタンスに必要なセットアップを実行する場所です。

トーストを表示するので、このライフサイクルメソッドがいつ呼び出されるかを正確に確認できます。

@Override public void onEnabled(Context context){Toast.makeText(context、 "onEnabled called"、Toast.LENGTH_LONG).show(); }

ユーザーがウィジェットのすべてのインスタンスを削除してから新しいインスタンスを作成すると、これが最初のインスタンスとして分類され、onEnabled()ライフサイクルメソッドが再度呼び出されることに注意してください。

onDisabledを使用したクリーンアップ

onDisabled()メソッドは、ACTION_APPWIDGET_DISABLEDに応答して呼び出されます。これは、ユーザーが 最終 ウィジェットのインスタンス。

このウィジェットライフサイクルメソッドは、onEnabled()メソッドで作成したリソースをクリーンアップする必要がある場所です。たとえば、onEnabled()で作成したデータベースを削除します。

コードをわかりやすくするために、このメソッドがトリガーされるたびにトーストを表示するだけです。

@Override public void onDisabled(Context context){Toast.makeText(context、 "onDisabled called"、Toast.LENGTH_LONG).show(); }

完成したAppWidgetProvider

CollectionWidgetファイルは次のようになります。

import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import androidx.annotation.NonNull; import android.content.Intent; import android.widget.RemoteViews; import android.widget.Toast; // AppWidgetProviderクラスから拡張// PublicクラスCollectionWidget extends AppWidgetProvider {static void updateAppWidget(Context context、AppWidgetManager appWidgetManager、int appWidgetId){//レイアウトリソースファイルをRemoteViewsオブジェクトにロード// RemoteViews views = new RemoteViews(context。 getPackageName()、R.layout.list_widget); setRemoteAdapter(context、views); // RemoteViewsオブジェクトについてAppWidgetManagerに通知します// appWidgetManager.updateAppWidget(appWidgetId、views); } @Override public void onUpdate(Context context、AppWidgetManager appWidgetManager、int appWidgetIds){for(int appWidgetId:appWidgetIds){updateAppWidget(context、appWidgetManager、appWidgetId); } super.onUpdate(context、appWidgetManager、appWidgetIds); } @Override public void onEnabled(Context context){Toast.makeText(context、 "onEnabled called"、Toast.LENGTH_LONG).show(); } @Override public void onDisabled(Context context){Toast.makeText(context、 "onDisabled called"、Toast.LENGTH_LONG).show(); } private static void setRemoteAdapter(Context context、@NonNull final RemoteViews views){views.setRemoteAdapter(R.id.widget_list、new Intent(context、WidgetService.class)); }}

AppWidgetProviderInfoファイル

また、アプリケーションウィジェットには、ウィジェットの最小サイズや更新頻度など、いくつかの重要なプロパティを定義するAppWidgetProviderInfoファイルも必要です。

AppWidgetProviderInfoファイルは、プロジェクトのres / xmlフォルダーに保存されます。

プロジェクトにまだこのフォルダーが含まれていない場合は、作成する必要があります。

  • Controlキーを押しながらプロジェクトのresフォルダーをクリックします。
  • [新規]> [Androidリソースディレクトリ]を選択します。
  • 次のウィンドウで、[リソースタイプ]ドロップダウンを開き、[xml]を選択します。
  • ディレクトリ名は自動的にxmlに更新されますが、更新されない場合は手動で変更する必要があります。
  • OKをクリックします。

次に、collection_widget_infoファイルを作成します。これをAppWidgetProviderInfoとして使用します。

  • Controlキーを押しながらプロジェクトのxmlフォルダーをクリックします。
  • [新規]> [XMLリソースファイル]を選択します。
  • このファイルにcollection_widget_infoという名前を付けます。
  • OKをクリックします。

AppWidgetProviderInfoファイルでは、次のプロパティを定義する必要があります。

1. android:previewImage

これは、デバイスのウィジェットピッカーでアプリケーションウィジェットを表すドロアブルです。

previewImageを提供しない場合、Androidは代わりにアプリケーションのアイコンを使用します。ウィジェットピッカーからウィジェットを選択するようユーザーに促すには、ユーザーのホーム画面で適切に構成されたウィジェットの外観を示すドロアブルを提供する必要があります。

プレビュー画像を作成する最も簡単な方法は、Androidエミュレーターに含まれているウィジェットプレビューアプリケーションを使用することです。このアプリでは、ウィジェットを設定してから画像を生成し、Androidプロジェクトで使用できます。

ウィジェットの作成が完了したらこの画像を作成するので、今のところは、自動生成されたmipmap / ic_launcherリソースを一時的なプレビュー画像として使用します。

2. android:widgetCategory

アプリケーションウィジェットは、通常はAndroidのホーム画面であるApp Widget Host内に配置する必要がありますが、Evie LauncherやNova Launcherなどのサードパーティランチャーにすることもできます。

APIレベル17と20の間では、アプリケーションウィジェットをホーム画面に配置できました または ロック画面ですが、ロック画面のサポートはAPIレベル21で廃止されました。

android:widgetCategory属性を使用して、アプリのウィジェットをホーム画面、ロック画面(Androidでは「キーガード」と呼びます)、またはその両方に配置できるかどうかを指定できます。 Androidの最新バージョンでは、ロック画面にウィジェットを配置することはできないため、ホーム画面のみをターゲットにします。

ユーザーのプライバシーを保護するため、ウィジェットをロック画面に配置するときに機密情報や個人情報を表示しないでください。

ユーザーにウィジェットをロック画面に配置するオプションを提供すると、ユーザーのデバイスを一目見れば誰でもウィジェットとそのすべてのコンテンツを見ることができます。ユーザーのプライバシーを保護するために、ウィジェットをロック画面に配置するときに機密情報や個人情報を表示しないでください。ウィジェットに個人データが含まれている場合は、ホーム画面とロック画面のレイアウトを個別に提供することを検討できます。

3. android:initialLayout

これは、ウィジェットをホーム画面に配置するときに使用するレイアウトリソースファイルです。プロジェクトの場合はlist_widget.xmlです。

4. android:resizeMode =” horizo​​ntal | vertical”

android:resizeMode属性を使用すると、ウィジェットを水平、垂直、または両方の軸に沿ってサイズ変更できるかどうかを指定できます。

ウィジェットがさまざまな画面で正しく表示および機能するようにするには、ウィジェットの水平方向のサイズ変更を許可することをお勧めします そして 特別な理由がない限り、垂直に。

5. android:minHeightおよびandroid:minWidth

ウィジェットのサイズを変更できる場合、ユーザーがウィジェットを使用できなくなるまで縮小しないようにする必要があります。 minHeight属性とminWidth属性を使用して、ユーザーがサイズを変更したときにアプリが縮小する最小値を定義できます。

これらの値はウィジェットの初期サイズも表すため、ウィジェットのサイズを変更できない場合、minHeightとminWidthがウィジェットの永続的なサイズを定義します。

6. android:updatePeriodMillis

AppWidgetProviderInfoは、ウィジェットが新しい情報を要求する頻度を指定する場所でもあります。

サポートされる最小更新間隔は、1800000ミリ秒(30分)に1回です。短い更新間隔を宣言しても、ウィジェットは30分ごとに更新されます。

最新の情報をできるだけ早く表示したい場合もありますが、システムは 意志 新しい情報を取得するために、スリープ状態のデバイスを起こします。頻繁に更新すると、特に夜間などデバイスがかなりの時間アイドル状態になっている期間中に、デバイスのバッテリーが焼損する可能性があります。最高のユーザーエクスペリエンスを提供するということは、バッテリー消費を制限することと、合理的な時間枠内で新しい情報を提供することとのバランスをとることを意味します。

ウィジェットが表示するコンテンツの種類も考慮する必要があります。

また、Android向けウィジェットに表示されるコンテンツの種類も考慮する必要があります。たとえば、天気ウィジェットは更新された予報を1日に1回取得するだけでよいのに対し、ニュース速報を表示するアプリはより頻繁に更新する必要があります。

この完璧なバランスを見つけるには、さまざまな更新頻度でウィジェットをテストし、バッテリー寿命への影響とウィジェットのコンテンツの適時性を測定する必要があります。テスターの自発的なグループがある場合は、A / Bテストをセットアップして、一部の更新頻度が他の更新頻度よりも積極的に受信されるかどうかを確認することもできます。

また読む: AndroidManifest.xml知っておくべきことすべて

最後に、完全な更新間隔を特定したら、アプリを開発およびテストする際に短い間隔を使用することをお勧めします。たとえば、アプリのonUpdate()メソッドが正しくトリガーされていることをテストするときに、可能な限り最短の更新頻度(android:updatePeriodMillis =” 1800000”)を使用し、アプリを一般公開する前にこの値を変更できます。

完成したAppWidgetProviderInfo

完成したcollection_widget_info.xmlファイルは次のようになります。

ユーザーのホームスクリーンを乱雑にしないでください!

ホームスクリーンが乱雑に見えないように、ウィジェットにパディングとマージンを追加します。プロジェクトにdimens.xmlファイルがまだ含まれていない場合は、作成する必要があります。

  • Controlキーを押しながらプロジェクトの値フォルダーをクリックします。
  • [新規]> [値]リソースファイルを選択します。
  • このファイルにdimensという名前を付けます。
  • OKをクリックします。

dimens.xmlファイルを開き、次のマージンとパディング値を定義します。

10dp 8dp

ウィジェットにデータを送信する

次に、ウィジェットデータをウィジェットに送信するウィジェットサービスを作成する必要があります。

WidgetServiceという名前の新しいJavaクラス(新規> Javaクラス)を作成し、次を追加します。

import android.content.Intent; import android.widget.RemoteViewsService;パブリッククラスWidgetServiceはRemoteViewsServiceを拡張します{@Override public RemoteViewsFactory onGetViewFactory(Intent intent){return new DataProvider(this、intent); }}

マニフェストにウィジェットを登録する

次に、プロジェクトのマニフェストにいくつかの変更を加える必要があります。

開始するには、マニフェストを開き、ウィジェットをBroadcastReceiverとして登録します。また、android.appwidget.action.APPWIDGET_UPDATEアクションのインテントフィルターを追加する必要があります。

次に、アプリウィジェットプロバイダーを指定する必要があります。

最後に、ウィジェットにデータを送信するサービス(このインスタンスではWidgetServiceクラス)を宣言する必要があります。このサービスにはandroid.permission.BIND_REMOTEVIEWS権限が必要です。

ウィジェットをテストする

このチュートリアルに従っていれば、ユーザーのホーム画面に一連のデータを表示する完全なコレクションウィジェットができました。

これが実際のAndroidプロジェクトである場合、通常はライフサイクルメソッド、特にonUpdate()メソッドを拡張しますが、Androidデバイスにインストールしてテストできるウィジェットを作成するために必要なのはこれだけです。

  • このプロジェクトを、互換性のあるAndroidスマートフォン、タブレット、またはAVD(Android Virtual Device)にインストールします。
  • ホーム画面の空のセクションを長押しし、プロンプトが表示されたらウィジェットを選択します。これにより、ウィジェットピッカーが起動します。
  • 作成したアプリケーションウィジェットが見つかるまで、ウィジェットピッカーをスワイプします。
  • このウィジェットを長押しして、ホーム画面に追加します。
  • これはこの特定のウィジェットの最初のインスタンスであるため、onEnabled()メソッドが実行され、「onEnabled called」トーストが表示されます。
  • ウィジェットのサイズを変更します。サポートされる最小サイズを設定する場合は、この値を超えてウィジェットを縮小できないことを確認してください。
  • ListViewが期待どおりにスクロールすることをテストします。
  • 次に、ウィジェットを削除して、onDisabled()メソッドを確認する必要があります。ウィジェットを長押しして、[ホーム画面から削除]を選択します。これがこの特定のウィジェットの最後のインスタンスであるため、onDisabled()メソッドが実行され、「onDisabled called」トーストが表示されます。

機能するAndroidアプリケーションウィジェットを提供するために必要なのはこれだけですが、ユーザーエクスペリエンスを向上させることができる追加機能がいくつかあります。以下のセクションでは、ウィジェットを最適に表示するプレビュー画像を作成することにより、ユーザーがウィジェットピッカーからこのウィジェットを選択することをお勧めします。また、構成アクティビティをプロジェクトに追加して、完全にカスタマイズ可能なウィジェットを作成する方法を示します。

Androidウィジェットのプレビュー画像の作成

Androidデバイスをつかんでウィジェットピッカーをスワイプすると、すべてのウィジェットが画像で表されていることがわかります。通常、このウィジェットは、ユーザーのホーム画面で設定したウィジェットの外観を示しています。

ユーザーにウィジェットの選択を促すには、ウィジェットが提供する必要のあるすべての有用な情報と機能を強調するプレビュー画像を提供する必要があります。

Androidエミュレータに含まれているウィジェットプレビューアプリケーションを使用して、プレビュー画像をすばやく簡単に作成できます。

ウィジェットプレビューは最新のAndroidシステムイメージには含まれていないため、Nougat(APIレベル25)以前を使用してAVDを作成する必要があります。

  • API 25以下を実行しているAVDにアプリケーションをインストールします。
  • AVDのアプリドロワーを開き、ウィジェットプレビューアプリを起動します。
  • ウィジェットプレビューには、このAVDに現在インストールされているすべてのアプリケーションのリストが表示されます。リストからアプリケーションを選択します。

  • これで、ウィジェットが空白の背景に表示されます。ウィジェットが提供する最高の結果が表示されるまで、ウィジェットのサイズを変更して微調整します。
  • ウィジェットの外観とコンテンツに満足したら、[スナップショットを取る]を選択します。

  • スナップショットを取得するには、Android Studioに切り替えて、ツールバーから[表示]> [ツールウィンドウ]> [デバイスファイルエクスプローラー]を選択します。これにより、Android Studioのデバイスファイルエクスプローラーが起動します。
  • デバイスファイルエクスプローラーで、sdcard / Downloadに移動します。次の形式で保存されたプレビュー画像が見つかります:_ori_.png

  • この画像をAndroid Studioからドラッグして、デスクトップなど、簡単にアクセスできる場所にドロップします。
  • この画像ファイルにわかりやすい名前を付けます。
  • ファイルをプロジェクトのドローアブルフォルダーにドラッグアンドドロップします。
  • このプロジェクトではcollection_widget_info.xmlであるAppWidgetProviderInfoを開きます。
  • android:previewImage =” @ mipmap / ic_launcher”行を見つけて、プレビュー画像を参照するように更新します。

ウィジェットは、この新しい画像リソースをプレビュー画像として使用します。

  • 更新されたプロジェクトを物理的なAndroidデバイスまたはAVDにインストールします。
  • ホーム画面の空のセクションを長押しします。
  • ウィジェットをタップすると、ウィジェットピッカーが起動します。
  • ウィジェットまでスクロールします。これで、更新されたプレビュー画像が使用されるはずです。

カスタマイズ可能なウィジェット:構成アクティビティの追加

ユーザーがウィジェットの各インスタンスをホーム画面に配置すると、構成アクティビティが自動的に起動します。

プロジェクトに構成アクティビティを追加する理由はいくつかあります。

ウィジェットは、個々のユーザーにとって最も重要な情報や機能へのアクセスを提供するときに、最高のユーザーエクスペリエンスを提供する傾向があります。

まず、一部のウィジェットでは初期設定が必要です。たとえば、交通情報を表示するウィジェットでは、ユーザーの自宅の住所、勤務地、通勤時間を知る必要がある場合があります。この情報を入力する何らかの方法がなければ、ウィジェットはまったく役に立たないかもしれません!

さらに、ウィジェットは、個々のユーザーにとって最も重要な情報または機能へのアクセスを提供するときに、最高のユーザーエクスペリエンスを提供する傾向があります。構成アクティビティをプロジェクトに追加することにより、ユーザーに選択と選択の自由を与えることができます まさに ウィジェットに含まれるもの。

ウィジェットの背景やフォントの変更など、比較的簡単なカスタマイズでさえ、ユーザーエクスペリエンスにプラスの影響を与える可能性があります。結局のところ、だれもホーム画面の残りの部分と視覚的に衝突するウィジェットに感謝しません!

誰もホーム画面の他の部分と視覚的に衝突するウィジェットに感謝しません!

または、ウィジェットに含めるコンテンツのリストが長い場合があり、オプションを絞り込むのに苦労しています。構成アクティビティは、すべてのアイデアを有効に活用する方法です。 作成 散らかった、紛らわしいウィジェット。ウィジェットの設定は面倒なことではないので、設定アクティビティを提供する場合は、3つの設定オプションに制限することをお勧めします。

プロジェクトに設定アクティビティを追加しましょう!

まず、構成アクティビティにはレイアウトが必要なので、config_activity.xmlという名前の新しいレイアウトリソースファイルを作成します。

このレイアウトに次のボタンを追加します。

  • 設定ボタン。実際のプロジェクトでは、このボタンは何らかの方法でウィジェットを変更します。たとえば、コンテンツの追加または削除、ウィジェットの更新頻度の変更などです。コードをわかりやすくするために、このボタンをクリックすると、単に構成オプションのトーストが表示されます。
  • 設定ボタン。ユーザーがウィジェットの構成に満足したら、このボタンを押すと、新しく構成されたウィジェットがホーム画面に配置されます。

完成したconfig_activity.xmlファイルは次のとおりです。

構成アクティビティを作成する

次に、構成アクティビティを作成する必要があります。

開始するには、ConfigActivityという名前の新しいJavaクラスを作成します。このアクティビティでは、設定アクティビティを起動したインテントからアプリウィジェットIDを取得します。このインテントにウィジェットIDがない場合は、finish()メソッドを呼び出す必要があります。

意図の意図= getIntent(); Bundle extras = intent.getExtras(); if(extras!= null){appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID、AppWidgetManager.INVALID_APPWIDGET_ID); if(appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){finish(); }

次に、戻りインテントを作成し、元のappWidgetIdを渡し、構成アクティビティから結果を設定する必要があります。

Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID、appWidgetId); setResult(RESULT_OK、resultValue); finish(); }}}

構成アクティビティを提供する場合、構成アクティビティの起動時にACTION_APPWIDGET_UPDATEブロードキャストは自動的に送信されません。つまり、onUpdate()メソッド しません ユーザーがウィジェットのインスタンスを作成するときに呼び出されます。

ウィジェットが最新の情報とコンテンツで作成されるように、構成アクティビティ しなければならない 最初のonUpdate()リクエストをトリガーします。

完成したConfigActivityは次のとおりです。

import android.app.Activity; import android.appwidget.AppWidgetManager; import android.os.Bundle; import android.widget.Button; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Toast;パブリッククラスConfigActivityはActivityを拡張します{@Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.config_activity); setResult(RESULT_CANCELED);ボタンsetupWidget =(ボタン)findViewById(R.id.setupWidget); setupWidget.setOnClickListener(new OnClickListener(){@Override public void onClick(View v){handleSetupWidget();}});ボタンconfigButton =(ボタン)findViewById(R.id.configButton); configButton.setOnClickListener(new OnClickListener(){@Override public void onClick(View v){handleConfigWidget();}}); } private void handleSetupWidget(){showAppWidget(); } private void handleConfigWidget(){Toast.makeText(ConfigActivity.this、 "Configuration options"、Toast.LENGTH_LONG).show(); } int appWidgetId; private void showAppWidget(){appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;意図の意図= getIntent(); Bundle extras = intent.getExtras(); if(extras!= null){appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID、AppWidgetManager.INVALID_APPWIDGET_ID); if(appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID){finish(); } // TO DO:構成の実行// Intent resultValue = new Intent(); resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID、appWidgetId); setResult(RESULT_OK、resultValue); finish(); }}}

構成アクティビティを作成したら、マニフェストでこのアクティビティを宣言し、APPWIDGET_CONFIGUREアクションを受け入れることを指定する必要があります。

最後に、構成アクティビティはパッケージスコープ外で参照されるため、AppWidgetProviderInfoでこのアクティビティを宣言する必要があります。このインスタンスはcollection_widget_info.xmlファイルです。

android:configure = "com.jessicathornsby.collectionwidget.ConfigActivity">

プロジェクトをテストする

次は、完成したプロジェクトをテストします。

  • 更新されたプロジェクトを物理的なAndroidデバイスまたはAVDにインストールします。
  • ウィジェットの以前のインスタンスをすべて削除して、最新バージョンで作業していることを確認します。
  • ホーム画面の空いている領域を長押しし、プロンプトが表示されたらウィジェットを選択します。
  • ウィジェットピッカーでウィジェットを見つけ、長押しして選択します。
  • ウィジェットをホーム画面にドロップします。構成アクティビティが自動的に起動するはずです。
  • [何らかの構成の実行]ボタンをクリックすると、構成オプションのトーストが表示され、この対話が正常に登録されたことを確認します。
  • ウィジェットの設定を微調整して、ホーム画面に配置する準備ができたとします。 [ウィジェットの作成]ボタンをタップすると、このウィジェットが正常に作成されます。

完成したコレクションウィジェットプロジェクトは、GitHubからダウンロードできます。

まとめ

この記事では、ユーザーのホーム画面にデータセットを表示するスクロール可能なコレクションウィジェットを作成しました。

このプロジェクトを引き続き使用する場合は、onUpdate()メソッドに独自のコードを追加して、AppWidgetProviderInfoファイル(collection_widget_info)で定義された間隔で新しい情報で更新するウィジェットを作成してみてください。

Androidウィジェットを作成する場合は、下のコメントで作成したものを必ず共有してください!

アクティブノイズキャンセリング(ANC)ヘッドフォンを探しているなら、おそらく2つのブランド、onyとBoeに出会っているでしょう。各ブランドは一般的な名前であり、最高のノイズキャンセリングヘッドフォンのリストのトップに位置しています。どちらも客観的に強力なパフォーマーですが、モバイルユーザーにとっては微妙な違いがあります。今日、これらの違いを分析し、ony WH-1000XM3がBoe QC 3...

ソニーは本日、Xperia 10およびXperia 10 Pluミッドレンジとともに、ony Xperia 1フラッグシップを発表しました。ソニーは、3つのデバイスがモダンな外観とパワフルなパフォーマンスを望む人々にアピールすることを望んでいます。ソニーは21:9のアスペクト比でオールインしています。 onyは、最新の3つの携帯電話すべてがこの画面形状を部分的に採用していると、多くのクリエイターが...

人気