CustomViewのインスタンスを取得するには
Androidにて複数のViewをまとめて1つのViewとして扱うことはできますか?
例えば以下の概形で表されるようなレイアウトがあるとします。
<!-- layout/my_view.xml(概形) -->
<LinearLayout>
<TextView android:id="@+id/title" />
<TextView android:id="@+id/content" />
</LinearLayout>
そしてこのルートであるLinearLayoutを継承したMyViewがあるとします
class MyView extends LinearLayout {
TextView titleTV, contentTV;
//コンストラクタもろもろ
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
View root = LayoutInflater.from(context).inflate(R.layout.my_view, this);
titleTV = root.findViewById(R.id.title);
contentTV = root.findViewById(R.id.content);
//TypedArrayなどもろもろ
}
public void setTitle(String title) {
titleTV.setText(title);
}
//以下メソッドもろもろ
}
これを利用するActivityが次のようにあるとします
レイアウトファイル
<!-- layout/activity_main.xml(概形) -->
<LinearLayout>
<***.***.MyView android:id="@+id/my_view_1" />
<***.***.MyView android:id="@+id/my_view_2" />
</LinearLayout>
クラス
class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.oncreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view = findViewById(R.id.my_view_1);
// view instanceof LinearLayout となってしまい以下のようにできない
MyView myView = (MyView)findViewById(R.id.my_view_2); //キャスト不可で落ちる
myView.setTitle("タイトル");
}
}
コード内に書いた通り、findViewbyIdで取得したインスタンスがルートのインスタンスとなってしまい、肝心のメソッドを使用することができません。
心当たりとしてLinearLayoutを継承したことが挙げられますが、代わりにViewを継承するとViewがViewGroupでないため、inflateの引数と一致しなくなってしまい困っています
class MyView extends View {
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
View root = LayoutInflater.from(context).inflate(R.layout.my_view, this);
// thisがViewGroupでないので×
View root = LayoutInflater.from(context).inflate(R.layout.my_view, null);
// 実行時にエラーが発生し×
}
}
なお<merge>
で囲うとよいというQ&AやDevelopersBlogを見ましたが、上記の問題によりうまく解決しませんでした。
どのようにすればCustomViewのインスタンスを取得できるのでしょうか?
/* 追記 */
まずは解決したことを報告させていただきます。(腑には落ちていないですが...)
1について
・今回はクラスに問題があると考え階層構造が分かる最低限を抜粋しました
2について
・内部でthis(context, attrs, defStyleAttr)を呼ぶだけであったので省略しました
3について
・API Level 26を使用していたため総称型により明示的なcastを省略しました
いずれについても詳細を記述するべきでした
Android Studio Previewでプログラムを組んでいたためAndroid Studio 2.6で書き直したところ正常に機能しました。
そこで再びPreview版でエラーを確認するために実行したところ今度は何故かすんなりと正常に実行されました。
よく分かりませんが解決はしました。
エラーが発生してから正常に実行されるまで該当箇所は書き換えておらず、何故急に型が変わったのか不明です。