Widgetを試してみた - 単純にテキストを表示させるだけ

実装したモノ

エミュレータ画像

「Hello Widget World!」というTextViewを、Widgetとして表示させただけ。

ソースコード

github.com

Widget実装の基本情報

  • AppWidgetProviderInfo オブジェクト
  • AppWidgetProvider クラスの実装
    • ウィジェットがイベント(ブロードキャスト)を受け取った際の動作を定義する
    • kt/javaファイルで記述する
  • ビューのレイアウト

やったこと

事前準備

New Project -> Empty Activity
でプロジェクトを作成。

AndroidManifest.xml

<application ...>
...
<receiver
android:name="WidgetSampleWidgetProvider"
android:exported="false">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/widget_sample_widget_info" />
</receiver>
</application>
receiverタグ
  • android:name
    • AppWidgetProviderを継承した自作クラスの名前を指定する
  • android:exported
    • 公式サイトによると、以下との事。
      • この要素では、アクティビティを他のアプリのコンポーネントから起動できるかどうかを設定します。起動できる場合は "true"、起動できない場合は "false" を指定します。"false" の場合、同じアプリまたは同じユーザー ID を持つアプリのコンポーネントからのみアクティビティを起動できます。
    • 他のアプリのコンポーネントから起動する予定は今のところ無いので、falseを指定
intent-filterタグ & actionタグ
  • android:name
    • 使用するintentを指定する
    • 今回は使わなかったけれど、後々使う予定なので記述だけした
meta-dataタグ
  • android:name
  • android:resource
    • AppWidgetProviderInfoリソースの場所を指定

WidgetSampleWidgetProvider.kt (「AppWidgetProvider クラスの実装」に該当)

今回は使わないので、とりあえず定義しただけ。

class WidgetSampleWidgetProvider : AppWidgetProvider() {
}

本来は、ここでウィジェットがイベント(ブロードキャスト)を受け取った際の動作を定義する。

widget_sample_widget_info.xml (「AppWidgetProviderInfo オブジェクト」に該当)

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="80dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/widget_sample_widget"
android:resizeMode="horizontal|vertical"
android:widgetCategory="home_screen">
</appwidget-provider>
appwidget=providerタグ
  • android:minWidth
    • 最小幅
    • 初期表示時は、この幅になる
  • android:minHeight
    • 最小高さ
    • 初期表示時は、この高さになる
  • android:updatePeriodMillis
    • ウィジェットの更新頻度
    • 例えば、お天気アプリのウィジェットであれば、1時間ごとくらいで天気情報を取得して表示すればいいはずなので
      60[分] * 60[秒] * 1000[ミリ] = 3,600,000[ミリ秒]
      を指定する
  • android:initialLayout
    • ビューのレイアウトの場所を指定する
  • android:resizeMode
    • どの方向に対してリサイズできるか?を指定する
    • horizontalで水平方向、verticalで垂直方向
  • android:widgetCategory
    • ウィジェットをどこに表示するか?を指定する
    • home_screenを指定すれば、ホーム画面でウィジェットを表示できるようになる
    • (昔(Android5.0未満)は、keyguardを指定すればウィジェットをロック画面に表示できた。)

widget_sample_widget.xml (「ビューのレイアウト」に該当)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="10dp"
android:background="#FFFF00">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello Widget World!" />
</RelativeLayout>

ここは適当。

但し、使用可能な

が限られているので、注意が必要。(詳しくは公式サイトを参照)

参考サイト

developer.android.com