web-dev-qa-db-ja.com

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

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(...)

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

206
Michal Dymel

私があなたの質問に従ったかどうかはわかりません。子ビューをRelativeLayoutに添付しようとしていますか。もしそうなら、あなたはの行に沿って何かをしたいです。

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

XMLリソースを膨らませる。 LayoutInflaterのドキュメント を参照してください。

レイアウトが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);
101
ccheneson

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

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

itemは、子レイアウトを追加する親レイアウトです。

25
Shaista Naaz

これは、古い投稿ですが、xmlから膨らませられている子ビューをビューグループレイアウトに追加する場合は、どのタイプのビューグループの手掛かりを付けてinflateを呼び出す必要があるかを追加すると便利です。に追加されます。好きです:

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

Inflateメソッドはかなりオーバーロードされており、ドキュメント内の使用法のこの部分について説明しています。このような変更を加えるまで、xmlから膨らんだ単一のビューが親の中で正しく整列されないという問題がありました。

18
Maximus

もっと簡単な方法は使うことです

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

レイアウトインフレ

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

アクティビティに参加していない場合は、LayoutInflaterクラスの静的なfrom()メソッドを使用して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年前になっていることを知っていますが、まだ言及する価値があります)

6
Juan Cortés

このリンクを確認してください。それは答え - > https://possiblemobile.com/2013/05/layout-inflation-as-intended/を持っています

4
Akshayraj Kore

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

   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);
        }

それからそれはすべての準備ができて追加されたビューの例外を投げます。

3
John smith

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
eSparkBiz Team

RelativeLayoutに子ビューを添付しようとしていますか?あなたは以下のようにすることができます

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

私はこのエラーで一番苦労しましたが、私の独特の状況のた​​めですが、ついに解決策を見つけました。

私の状況:WebViewを保持していて、メインアクティビティビューのボタンをクリックするとAlertDialogで開く別のビュー(XML)を使用しています。しかしどういうわけか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
Azurespot

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

  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

Kotlinでは、次のことができます。

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

[your_main_layout].apply {
    //..
    addView(content)
}
1
Hasan A Yousef

それほど単純で複雑なことは必要ありません。

 setContentView(R.layout.your_layout);
0
Saddan