そこで、CustomTitlebarActivityというActivityサブクラスを作成しました。基本的に、アプリの各メインアクティビティには、ホームボタン、タイトル、検索ボタンなどの多くの一般的な機能を備えたカスタムタイトルバーがあります。現在の実装では、レイアウトXMLでincludeステートメントを明示的に使用しています。各CustomTitlebarActivity:
<include layout="@layout/titlebar" />
CustomTitlebarActivity内でこれを実行できるのは当然のことです。 2つの質問があります。このインクルードタグを置き換えることができるコードと、そのコードをどこに配置すればよいですか。 (私の最初の本能は、CustomTitlebarActivityのsetContentViewメソッドに入れることです。)
関連するメモでは、Android UIコードを再利用するためのより良い方法についての洞察に感謝します(それ自体、タイトルバーはアクティビティ間でわずかに異なる必要がある場合でも))
個人的には、おそらくActivity
サブクラスを作成して、常にsetContentView
を、タイトルバーのみを含む垂直__fill_parent
_ LinearLayout
を含むレイアウトファイルに書き込みます。
_<LinearLayout Android:id="@+id/custom_titlebar_container"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<!--titlebar here-->
</LinearLayout>
_
次に、CustomTitlebarActivity
の抽象getContentAreaLayoutId()
メソッドを定義して、各サブクラスのタイトルバーの下にあるコンテンツのレイアウトID
を返します。 CustomTitlebarActivity
のベースonCreate()
は、
_setContentView(R.layout.custom_titlebar_activity_frame_from_above);
View.inflate(this, getContentAreaLayoutId(), findViewById(R.id.custom_titlebar_container));
_
別の方法として、コンテンツ領域にView
ではなくint
を返す抽象メソッドを持たせて、ビューを動的に構築する柔軟性を高めることができます(ただし、単純にこのXMLレイアウトをここにダンプしますケース)。
私もこの問題に出会いましたが、今は解決しました。私の解決策は簡単だと思います:
インフレータを作成します。
LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE);
子レイアウトを膨張させます:
View childLayout = inflater.inflate(R.layout.child,
(ViewGroup) findViewById(R.id.child_id));
親に追加します:
parentLayout.addView(childLayout);
終わった、楽しんで!