こんにちは。仕事でAndroidプログラムをやってるものです。
きょうは、最近仕事でやったことについて、知見を共有したいと思います。
ソースだけ見たい方は以下のリポジトリへどうぞ。(この記事もほとんどソースですが…)
サンプルソース
テスト環境
macOS High Sierra
Android Studio 3.0.1
ベース画面作成
レイアウトファイルを作成します。Sceneを設定したいViewGroupにIDを振っておきましょう。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scene_root"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
Scene用のレイアウト生成
レイアウトファイルを作成します。データなどは適当に設定してます。
scene_a.xml
<layout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="description"
type="String"/>
<variable
name="buttonText"
type="String"/>
<variable
name="onClickListener"
type="android.view.View.OnClickListener"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="シーンA"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:text="@{description}"
tools:text="説明"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{buttonText}"
android:onClick="@{onClickListener}"/>
</LinearLayout>
</layout>
SceneとDataBindingの連携
Bindingから作成したレイアウトとSceneを連携させます。
MainActivity.java
public class MainActivity extends AppCompatActivity {
private Scene sceneA;
private Scene sceneB;
private Scene sceneC;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = LayoutInflater.from(this);
ViewGroup sceneRoot = findViewById(R.id.scene_root);
sceneA = createSceneA(inflater, sceneRoot);
// sceneB・Cも同様に
// 最初のシーンAへ
TransitionManager.go(sceneA);
}
private Scene createSceneA(LayoutInflater inflater, ViewGroup sceneRoot) {
SceneABinding binding = SceneABinding.inflate(inflater, sceneRoot, false);
binding.setDescription("これはシーンAです。");
binding.setButtonText("シーンBに行こうね");
binding.setOnClickListener(view -> TransitionManager.go(sceneB));
return new Scene(sceneRoot, binding.getRoot());
}
// createSceneB・Cも同様に
}
これでSceneとDataBindingを連携させることができました。
まとめ
以上で説明は終わりです。
何か不明な点・間違いがあったらコメントで指摘おねがいします。