Android TVアプリ開発の概要

この記事では、Android TV用のシンプルなアプリケーションの開発を紹介します。 まず、Android向けアプリケーションの開発経験がある人を対象としているため、ここではアクティビティ、フラグメントなどについて説明しません。



インターネット上には、Android用アプリケーションの開発に関するロシア語の情報がたくさんあり、彼のためにHelloWordを書くことに関するいくつかの記事はありません。 Android TV向けのアプリケーションの開発に興味があり、すぐに英語のサイトでこのトピックを勉強し始めました。 驚いたことに、この資料はそれほど多くなかったので、ロシア語版を見ることにしました。 ロシア語で何かを見つけることができませんでした(ひどく見ていました)。 一般的に、私はこの状況を修正するつもりです。



電話とAndroid TVのアプリケーションインターフェースには大きな違いがあるため、テレビでの対話に適したアプリケーションインターフェースを作成する必要があります。 たとえば、キー-↑↓→←のみを使用して対話できるアプリケーションを作成する必要があります。 LeanbackSupportライブラリは、このインターフェイスの実装に役立ちます。これにより、Android TVでアプリケーションを操作するときに便利なUIを簡単に作成できます。



Android Studioでプロジェクトを作成する



Android Studioを起動して、新しいプロジェクトを作成する必要があります。 作成時に、TVプラットフォームを選択し、SDKの最小バージョンを指定します。 Android Studioは「Android TVアクティビティ」の作成を提案しますが、現時点では「アクティビティを追加しない」を選択する必要があります。 アクティビティの作成を選択すると、ASは最初から理解しにくい多くのクラスとファイルを作成します。



アクティビティを作成



最初に、アクティビティのマークアップを含むactivity_main.xmlという新しいXMLファイルを作成する必要があります。 マークアップコードは後で変更します。



次に、Activityから継承したクラスを作成する必要があります。 これを行うには、MainActivityという名前の新しいクラスを作成し、Activtyクラスから継承します。 onCreate(Bundle SIS)メソッドを定義し、その中に作成されたマークアップファイルからアクティビティのコンテンツを設定します。



public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
      
      





アプリケーションマニフェストファイルでのアクティビティ宣言



この段階でアプリケーションを起動しようとしても、AndroidManifest.xmlファイルではアクティビティを宣言していないため、当然起動しません。



次のコードをマニフェストファイルに追加する必要があります。



 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.simpletvapp"> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.software.leanback" android:required="true" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.Leanback"> <activity android:name=".MainActivity" android:icon="@drawable/app_icon_your_company" android:label="@string/app_name" android:logo="@drawable/app_icon_your_company" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
      
      





それでは、いくつかのポイントを見てみましょう。 以下のコードの一部は、タッチを無効にします。



 <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
      
      





このパートでは、アプリケーションをAndroid TVでのみ実行することを示します。 テレビだけでなくアプリケーションを開発している場合は、falseに設定する必要があります。



 <uses-feature android:name="android.software.leanback" android:required="true" />
      
      





アクティビティを宣言するとき、intent-filterでAndroid TVでアクティビティを実行するように指定します。



 <category android:name=”android.intent.category.LEANBACK_LAUNCHER/>
      
      





フラグメント作成



次に、MainFragmentという名前のJavaクラスを作成し、LeanbackSupportライブラリのBrowseFragmentクラスを継承する必要があります。 BrowseFragmentを使用すると、Android TVの標準アプリケーションインターフェイスを作成できます。



作成したフラグメントをアクティビティにバインドすることができますこれを行うには、アクティビティマークアップファイル(私の場合はactivity_main.xml)に次のマークアップコードを配置します。



 <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_browse_fragment" android:name="com.simpletvapp.MainFragment" android:layout_width="match_parent" android:layout_height="match_parent" />
      
      





アプリケーションの起動



アプリケーションを実行するには、Android TVエミュレーターを作成する必要があります。 Android Virtual Device Managerで作成できます。



エミュレータを作成したら、その上でアプリケーションを実行できます。 現時点では、次の形式になっています。







ここでは、空のBrowseFragmentが表示されます。 アプリケーションの左側にあるRowsFragment(フラグメントがヘッダーのリストを表示する役割を果たします)と画面の右側にあるHeaderFragmentを見ることができます(ヘッダーのコンテンツを表示する役割を果たします)。



次に、HeaderFragment、RowsFragmentを入力し、それらをより詳細に検討します。 その前に、UIの原色とアプリケーションのタイトルを設定します。



アプリスタイルのカスタマイズ



ここで、setupUI()メソッドをMainFragment.javaに追加し、onActivityCreated定義済みメソッドで呼び出しました。



  @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setupUI(); } private void setupUI() { setTitle("Hello Android TV!"); int color = ContextCompat.getColor(getActivity(), R.color.fastlane_background); setBrandColor(color); }
      
      





この段階でアプリケーションを実行すると、そのようなUIが表示されるはずです。







BrowseFragment Fill



最初に、完成したAndroid TVアプリケーションの例、BrowseFragmentのコンテンツを見てみましょう。 フラグメント(HeaderItem)の左側の各タイトルには、右側にコンテンツのある行があります。 「ヘッダー(HeaderItem)+アプリケーションの右側のコンテンツ」の組み合わせには、ListRowクラスが含まれます。 BrowseFragmentの内容は、ListRowのリストです。 タイトルと右側のコンテンツのリストは、1対1に関連しています。







ListRowについて詳しく見てみましょう。 ArrayObjectAdapterは、コンテンツを含むリストを担当します。 この場合、CardInfoはコンテンツアイテムです。 CardInfoには任意のオブジェクトを指定できます。 CardInfoを作成して表示する方法は、後で検討します。







これで、次の結論を導き出すことができます。



ArrayObjectAdapter-ListRowからのリストを担当します

ListRow = HeaderItem(ヘッダー)+ ArrayObjectAdapter(右側のコンテンツのリスト)



クラスプレゼンター



コンテンツ要素の入力は、LeanbackSupportライブラリのPresenterクラスを使用して決定されます。 コンテンツアイテムの表示を定義します。 Presenterは抽象クラスなので、新しいクラスを作成してPresenterから継承する必要があります。 新しいクラスを作成する場合、少なくとも3つのメソッドを事前定義する必要があります。



 onCreateViewHolder(ViewGroup parent); onBindViewHolder(ViewGolder, viewHolder, Object item); onUnbindViewHolder(ViewHolder viewHolder);
      
      





Presenterには、View(コンテンツアイテム)を参照できる内部ViewHolderクラスが含まれています。 たとえば、クラスPresenter onBind()またはonUnbind()のメソッドで、特定のイベントのViewHolderを介してViewにアクセスできます。



HeadersFragmentとRowsFragmentの塗りつぶし



ビジネスに取り掛かろう。 ここでは、Presenterクラスから継承したGridItemPresenterクラスを作成します。 このアプリケーションでは、オブジェクト(コンテンツ要素)に文字列が表示され、ViewHolderにはその文字列を表示するTextViewが含まれています。 ビューはonCreateViewHolder()メソッドで作成され、その入力はonBindViewHolder()メソッドで行われます。



 public class GridItemPresenter extends Presenter { private static final int WIDTH_ITEM = 300; private static final int HEIGHT_ITEM = 200; @Override public ViewHolder onCreateViewHolder(ViewGroup parent) { TextView view = new TextView(parent.getContext()); view.setLayoutParams(new ViewGroup.LayoutParams(WIDTH_ITEM, HEIGHT_ITEM)); view.setFocusable(true); view.setFocusableInTouchMode(true); view.setGravity(Gravity.CENTER); view.setBackgroundColor(ContextCompat.getColor(parent.getContext(), R.color.default_background)); view.setTextColor(Color.WHITE); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder viewHolder, Object item) { TextView textView = (TextView) viewHolder.view; String str = (String) item; textView.setText(str); } @Override public void onUnbindViewHolder(ViewHolder viewHolder) { } }
      
      





loadRows()メソッドをMainFragmentクラスに追加し、onActivityCreated()定義済みメソッドで呼び出します



  private void loadRows() { // ,   ListRow (ListRow =  + ) ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); //    ,         , //      " 1" HeaderItem headerItem = new HeaderItem(0, " 1"); //  ,      GridItemPresenter itemPresenter = new GridItemPresenter(); // ,        ArrayObjectAdapter gridAdapter = new ArrayObjectAdapter(itemPresenter); //     gridAdapter.add(0, " 1"); gridAdapter.add(1, " 2"); gridAdapter.add(2, " 3"); //  ,   ListRows,  ListRow. //    ,     ,   //    rowsAdapter.add(new ListRow(headerItem, gridAdapter)); setAdapter(rowsAdapter); }
      
      





これで、アプリケーションを起動して、下の画面を見ることができます。







今のところすべてです。 この記事では、Android TV用のアプリケーションを作成するための基本原則のいくつかを説明しようとしました。



この記事とこのマニュアルは、この記事の基礎となるものです。



All Articles