web-dev-qa-db-ja.com

Androidプログラムでレイアウトを含める(つまりXMLなし)

そこで、CustomTitlebarActivityというActivityサブクラスを作成しました。基本的に、アプリの各メインアクティビティには、ホームボタン、タイトル、検索ボタンなどの多くの一般的な機能を備えたカスタムタイトルバーがあります。現在の実装では、レイアウトXMLでincludeステートメントを明示的に使用しています。各CustomTitlebarActivity:

<include layout="@layout/titlebar" />

CustomTitlebarActivity内でこれを実行できるのは当然のことです。 2つの質問があります。このインクルードタグを置き換えることができるコードと、そのコードをどこに配置すればよいですか。 (私の最初の本能は、CustomTitlebarActivityのsetContentViewメソッドに入れることです。)

関連するメモでは、Android UIコードを再利用するためのより良い方法についての洞察に感謝します(それ自体、タイトルバーはアクティビティ間でわずかに異なる必要がある場合でも))

35
Jon Willis

個人的には、おそらく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レイアウトをここにダンプしますケース)。

18
Yoni Samlan

私もこの問題に出会いましたが、今は解決しました。私の解決策は簡単だと思います:

  1. インフレータを作成します。

    LayoutInflater inflater = (LayoutInflater)      this.getSystemService(LAYOUT_INFLATER_SERVICE);
    
  2. 子レイアウトを膨張させます:

    View childLayout = inflater.inflate(R.layout.child,
                (ViewGroup) findViewById(R.id.child_id));
    
  3. 親に追加します:

    parentLayout.addView(childLayout);
    

終わった、楽しんで!

59
acoustic