プログラムによってビューをビューに追加する方法


179

のは、私が持っているとしましょうLinearLayout、と私はJavaコードから私のプログラムでは、それにビューを追加したいです。これにはどのような方法が使用されますか?私はそれがXMLでどのように行われるかを尋ねているのではありませんが、このサンプルコードの行に沿って、どうすればよいですか?

(One View).add(Another View)

Swingでできることのように。

回答:


248

電話をaddViewかけるのが正しい答えですが、それを機能させるには、それよりも少し多くする必要があります。

コンストラクター(などButton myButton = new Button();)を介してビューを作成する場合setLayoutParams、新しく作成された子を親ビューに追加する前に、新しく作成されたビューを呼び出し、親ビューのLayoutParams内部クラスのインスタンスを渡す必要があります。

たとえばonCreate()、LinearLayoutにidがあると想定して、関数に次のコードを含めることができますR.id.main

LinearLayout myLayout = findViewById(R.id.main);

Button myButton = new Button(this);
myButton.setLayoutParams(new LinearLayout.LayoutParams(
                                     LinearLayout.LayoutParams.MATCH_PARENT,
                                     LinearLayout.LayoutParams.MATCH_PARENT));

myLayout.addView(myButton);

LayoutParamsを必ず設定することが重要です。すべてのビューには、少なくともlayout_widthパラメータとlayout_heightパラメータが必要です。また、適切な内部クラスを取得することも重要です。TableRow.LayoutParamsのインスタンスを子ビューのsetLayoutParamsに渡していないことがわかるまで、TableRowに追加されたビューを正しく表示するのに苦労しました。


5
プログラムでビューをどのように作成しますが、この新しいビュー用に特別に記述したXMLレイアウトファイルを使用しますか?
SK9、2011年

9
@ SK9コンテキスト(通常は現在のアクティビティ)から取得できるLayoutInflaterを使用します。例:LayoutInflater myInflater = getLayoutInflater; ビューmyView = myInflater.inflate(R.layout.myLayout、parent、false);
ブライアンクーリー2011年

1
実際、getLayoutInflater()は(Contextではなく)Windowクラスから取得され、Activityの便利なメソッドです。
ブライアンクーリー2011年

2
コーディングの実践として、findViewByIdで、ViewGroupまたは常に最も一般的なオブジェクトの形式にキャストして、LinearLayoutからRelativeLayoutに変更された場合にリファクタリングを行わないようにします。
Joel Teply、2015

1
これらはいくつかの詳細です:D
Vivek Solanki

51

まだ興味がある人のために:

私が見つけた最善の方法は、Viewの静的静的メソッドを使用することです。

View inflatedView = View.inflate(context, yourViewXML, yourLinearLayout);

ここで、yourViewXMLはR.layout.myViewのようなものです。

ビューを追加するためにはViewGroupが必要であることに注意してください(これは考えられるレイアウトです)

例として、すでに表示されているフラグメントがあり、ルートビューがレイアウトであることがわかっていて、それにビューを追加するとします。

    View view = getView(); // returns base view of the fragment
    if (view == null)
        return;
    if (!(view instanceof ViewGroup))
        return;

    ViewGroup viewGroup = (ViewGroup) view;
    View popup = View.inflate(viewGroup.getContext(), R.layout.someView, viewGroup);

静的メソッドを作成することもできます。これは、フラグメントの例を拡張するために、... addView(View v){ // your code after get view }を使用して見つかったビューfindViewById(int resourceID)またはインフレートされたビューを取得するようなものinflatedViewです。
zgc7009

22

これは遅いですが、これは誰かを助けるかもしれません:) :)ビューをプログラムで追加するには、次のようにしてください

LinearLayout rlmain = new LinearLayout(this);      
LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT);          
LinearLayout   ll1 = new LinearLayout (this);

ImageView iv = new ImageView(this);
iv.setImageResource(R.drawable.logo);              
LinearLayout .LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);

iv.setLayoutParams(lp);
ll1.addView(iv);
rlmain.addView(ll1);              
setContentView(rlmain, llp);

これにより、ビュー全体がプログラムで作成されます。同じように任意の数のビューを追加できます。これが役立つことを願っています。:)



3

アクティビティからビューを追加するもう1つの方法

ViewGroup rootLayout = findViewById(android.R.id.content);
rootLayout.addView(view);

0

プログラムで制約を設定するという考えは面倒な場合があります。以下のこの解決策は、制約、線形などのあらゆるレイアウトで機能します。最適な方法は、プログラムで作成されたビューを期待する場所にプレースホルダー、つまり適切な制約(または線形などの他のレイアウトに適切に配置)を備えたFrameLayoutを設定することです持つため。

必要なのは、プログラムでビューをインフレートすることと、メソッドを使用してFrameLayoutの子としてビューを拡張するaddChild()ことだけです。次に、実行時にビューが膨張し、正しい位置に配置されます。Androidの推奨事項に従って、FrameLayout [リンク]には childViewを1つだけ追加する必要があります。

次のコードは、特定の位置にプログラムでTextViewを作成する場合を想定しています。

ステップ1:

膨張するビューを含むレイアウトで、FrameLayoutを正しい位置に配置し、IDを指定します。たとえば、「コンテナー」です。

ステップ2 実行時に拡張するビューとしてルート要素を使用してレイアウトを作成し、レイアウトファイルを「textview.xml」として呼び出します。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

</TextView>

ところで、frameLayoutのlayout-paramsをwrap_contentに設定してください。そうしないと、フレームレイアウトは親、つまりアクティビティ、つまり電話スクリーンと同じ大きさになります。

android:layout_width="wrap_content"
android:layout_height="wrap_content"

設定されていない場合、フレームの子ビューはデフォルトでフレームレイアウトの左上に移動するため、ビューは画面の左上に移動するだけです。

ステップ3

oncreateメソッドで、次のようにします。

FrameLayout frameLayout = findViewById(R.id.container);
                TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
                frameLayout.addView(textView);

findViewByIdtoの最後のパラメーターを設定し、コンテナービュー(frameLayout)をnull呼び出すことによってビューを追加するaddView()ことはtrue、の3番目のパラメーターを渡してインフレートされたビューを単にアタッチすることと同じですfindViewById()。詳細については、これを参照してください。)


0

また、オーバーライドonLayoutするときにsuper.onLayout、すべてのプロパティで呼び出す必要があるかどうかを確認する必要があります。そうしないと、ビューが膨張しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.