極力避けて通りたいレイアウトファイル
めんどくさいよね。
できれば、書きたくないし、アプリって大体UI統一されてるよね、ってことで、xmlをテンプレート的に扱うための簡単なソリューションです。
Fragment使えよ・・・
そうですね、そうですね、よくわかりますよ。
でもActivityだけで完結させたいことってあるじゃないですか。
私にはあるんです・・・。
Fragmentあまり好きじゃない(ボソ・・・
本題
どうやって解決しようか悩みました。
xmlにテンプレート機能なんてないんですもの。
でも、基本的なレイアウトは統一したい・・・。
悩んだ結果、私は、親になるActivityを作ることにしました。
コードはこんな感じ
BaseActivityを作って、以下のメソッドを作っておきます。
/**
* テンプレートにレイアウトをはめ込む
*
* @param layoutID
*/
protected void setContentViewByTemplate(int layoutID) {
View contentView = getLayoutInflater().inflate(R.layout.template_main_layout, null);
FrameLayout layoutContainer = (FrameLayout) contentView.findViewById(R.id.layout_container);
// MainActivityのレイアウトを追加
layoutContainer.addView(getLayoutInflater().inflate(layoutID, null));
setContentView(contentView);
}
説明
基本的には、Fragmentと同じ考え方だと思います。
親のレイアウトに、layout_containerっていうViewを作ってきます。これはLinearLayoutでもFrameLayoutでもなんでもいいです。
このcontainerに、Viewをaddしています。
使い方
そして、MainとなるActivityからはこんな風に使います。
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentViewByTemplate(R.layout.activity_main);
以下略
説明
activity_mainは、アクションバーとかボトムナビとかを除いた、その画面だけのレイアウトです。
例えば、こんな感じ
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- HelloWorld -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="hello world!" />
</RelativeLayout>
こうしておくことで、もしそのActivityの画面Fragmentにしてよって言われた時、そのままFragmentのレイアウトとしても使えるので、結構便利です。
まとめ
こうしておくと、コードの切り分けもできます。
ActionBarやBottomNavigationなど共通する部分の処理は、BaseActivityに、その画面特有の処理はそのなんちゃらActivityにって感じで書けます。
エラーメッセージなんかのダイアログやプレグレスなんかも、BaseActivityに書いておくと便利です。
extendsしておけば、そのまま使えますからね。
まだ開発中って時なんかは、ActionbarとかBottomnaviとか変更が多発したりするんですよ・・・。
でも、こうしておけば、共通部分のレイアウトに変更があった時なんかも修正箇所が少なくて済んでいます。
以上、テンプレート的に扱いたい場合のソリューションでした。