レイアウトで1つのビューを膨らませる方法


221

XMLで定義されたレイアウトがあります。以下も含まれます:

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

このRelativeViewを他のXMLレイアウトファイルで膨らませたいと思います。状況に応じて異なるレイアウトを使用する場合があります。どうすればよいですか?私はさまざまなバリエーションを試していました

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

しかし、どれもうまくいきませんでした。

回答:


390

私があなたの質問をフォローしたかわかりません-あなたは子ビューをRelativeLayoutにアタッチしようとしていますか?もしそうなら、あなたは次の線に沿って何かをしたいです:

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
エラーが表示されます:02-25 22:21:19.324:ERROR / AndroidRuntime(865):原因:java.lang.IllegalStateException:指定された子にはすでに親があります。最初に、子の親でremoveView()を呼び出す必要があります。
Michal Dymel、2010

27
今すぐこれを試してみましたが、私は必要でした:View child = getLayoutInflater()。inflate(R.layout.child、null);
James

3
問題はコードではありません。コードをたどることはかなり簡単です。xmlファイルはどこに作成しますか。タイプはテーマスタイルのリソースですか?私が含まれていると思う問題は、このxmlファイルをどこに配置するかです
Lpc_dark

15
これは完璧ではありません。インフレータの3パラメータバージョンを使用する必要があります-理由は次のとおり
Nick Cardoso

3
それが機能しても、答えは正しくありません。チェックしてくださいこの記事は possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

XMLリソースを膨らませます。LayoutInflater docを参照してください。

レイアウトがmylayout.xmlにある場合は、次のようにします。

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
メインビューが膨らんでいます。問題は、他のXMLファイルからその一部を膨らませたいことです。このアイテムRelativeLayoutは、より大きなレイアウトの一部であり、別のXMLファイルのレイアウトで埋めたいです。
Michal Dymel、2010

申し訳ありませんが、私には手掛かりがありません:(。メインビューで<include>などを使用して他のレイアウトを含めていますか?
ccheneson

いいえ、シンプルなレイアウトです。XMLなしで、プログラムで要素を追加するだけだと思います。手伝ってくれてありがとう!
Michal Dymel、2010

27

遅い答えですが、これを取得するための1つの方法を追加したいと思います

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

どこitemあなたは子のレイアウトを追加したい親のレイアウトです。


(後でさえ)私はあなたの答えを実装するのに苦労しています。上記のコードを試してみましたが、「item」を「R.layout.activity_layout」に置き換えました。「「(int、int)」に適用できるメソッドはありません」というメッセージが表示されます
カイル

1
@カイル-まだまだ。Rリソースをオブジェクトへの参照として使用することはできませintん。それらは単なるsです。あなたは使用する必要がありfindViewById、それを渡しRたリソースを、その種類は、あなたの目的のオブジェクトにキャストします。次に、のような関数呼び出しで使用できますinflate。(つまりViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... ... item上記のように使用できます。)
Pimp Trizkit、2013年

上記の例では、基本クラスをインスタンス化できないため、RelativeLayout代わりに使用することをViewGroupお勧めしますViewGroup。5分の編集ルールが私を手に入れました。笑
Pimp Trizkit、2013年

親を非表示にして子ビューのみを表示することは可能ですか
NovusMobile

おかげで、フラグメントを使用しているため、このメソッドは前の例でgetContext()を使用できない場所を助けました。
RightHandedMonkey 2013

19

これは古い投稿ですが、xmlから拡張されている子ビューをビューグループレイアウトに追加する場合は、ビューグループのタイプの手掛かりを使用してinflateを呼び出す必要があることを追加しておくと役立ちます。追加されます。お気に入り:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

inflateメソッドはかなりオーバーロードされており、ドキュメントの使用法のこの部分について説明しています。このタイプの変更を行うまで、xmlからインフレートされた単一のビューが親で正しく位置合わせされないという問題がありました。


最後に、ありがとうございます:)これにより、1つの親に複数のビューを追加できますが、XMLから読み取られるLayoutParamsについて心配する必要はありません。よくやった!
砂防

13

さらに簡単な方法は、

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

使用するにはView.inflate()、不要な無最良の方法であるLayoutInflaterか、getSystemService(Context.LAYOUT_INFLATER_SERVICE)またはすべてが迷惑のいずれか!:D
varun

8

レイアウトインフレ

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

6

アクティビティに参加していない場合from()は、LayoutInflaterクラスの静的メソッドを使用してを取得しLayoutInflaterたり、コンテキストメソッドからサービスを要求したりgetSystemService()できます。

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(私はそれがほぼ4年前であることを知っていますが、言及する価値があります)


4

単一のビューを複数回追加する場合は、使用する必要があります

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

あなたが好きなら

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

そして

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

次に、追加されたすべてのビューの例外をスローします。


4

AttachToRootをTrueに設定

XMLレイアウトファイルでボタンを指定し、そのレイアウトの幅と高さをmatch_parentに設定したと考えてください。

<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>

このボタンをクリックすると、次のコードを設定して、このアクティビティのレイアウトを拡張できます。

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

この解決策がうまくいくことを願っています。


3

このコードを試してください:

  1. レイアウトを膨らませたいだけの場合:

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. コンテナ(親レイアウト)でレイアウトを膨らませたい場合:

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

私のユニークな状況のため、私はこのエラーで最も苦労しましたが、最終的に解決策を見つけました。

私の状況:を保持する別のビュー(XML)を使用していてWebViewAlertDialogメインアクティビティビューのボタンをクリックするとが開きます。しかし、どういうわけかWebView、メインアクティビティビューに属していた(おそらくここからリソースをプルしたため)、それをAlertDialog(ビューとして)に割り当てる直前に、の親を取得WebViewしてViewGroup、次に、そのすべてのビューを削除しますViewGroup。これはうまくいき、私のエラーは消えました。

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

....後、私は自分をロードした後にWebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

子ビューをRelativeLayoutにアタッチしようとしている場合は?あなたは以下によって行うことができます

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

Kotlinでは、以下を使用できます。

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

私はこれのために以下のコードスニペットを使用しましたが、それは私にとってはうまくいきました。

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.