web-dev-qa-db-ja.com

複数のカスタムビューをプログラムでレイアウトに追加する

たとえば、次のような空のレイアウトがある場合:

layout1.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical" >

</LinearLayout>

そして、このような他のレイアウト:

layout2.xml

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="horizontal" >

    <TextView
        Android:id="@+id/button1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="TextView 1" />

    <Button
        Android:id="@+id/button2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button 2" />

    <Button
        Android:id="@+id/button3"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="Button 3" 
        Android:layout_weight="1"/>

</LinearLayout>

プログラムでlayout2.xmllayout1.xmlに追加したいと思います。必要なときに追加する複数の異なるバージョンlayout2.xmlが必要になります。それぞれがTextViewとボタンに異なるテキストを持ちます。

通常のAndroid Viewの場合、私は通常addViewを使用して次のようにそれを行います。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    TextView tv1 = new TextView(this);
    tv1.setText("HELLO");
    my_linear_layout.addView(tv1);

    Button btn2 = new Button(this);
    bt2.setText("WORLD");
    my_linear_layout.addView(btn2);
}

TextViewやButtonのような単純なものがなく、独自のxml定義ビューがある場合、どうすればよいですか?

ListViewのようにアダプター内にすべてのビューを何らかの方法で配置し、必要なときに取得して、それらのビューでaddViewを呼び出すことは可能でしょうか?

26
user3304086

Layout2.xmlファイルを膨らませ、テキストを編集し、最初のレイアウトに追加できます。

public class MyActivity extends Activity {

    private ViewGroup mLinearLayout; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout1);
        mLinearLayout = (ViewGroup) findViewById(R.id.linear_layout);
        addLayout("This is text 1", "This is first button", "This is second Button");
    }

    private void addLayout(String textViewText, String buttonText1, String buttonText2) {
        View layout2 = LayoutInflater.from(this).inflate(R.layout.layout2, mLinearLayout, false);

        TextView textView = (TextView) layout2.findViewById(R.id.button1);
        Button button1 = (Button) layout2.findViewById(R.id.button2); 
        Button button2 = (Button) layout2.findViewById(R.id.button3);

        textView1.setText(textViewText);
        button1.setText(buttonText1);
        button2.setText(buttonText2);

        mLinearLayout.addView(layout2);
    }
}

Layout2.xmlルートビューのAndroid:layout_heightwrap_contentに変更することもできます。

45
pdegand59

layout1には親レイアウトとしてScrollViewが含まれ、行アイテムに画面サイズがこれ以上ない場合、メインのLinearLayoutが子として含まれますScrollViewはscrollでオーバーフローアイテムを処理します。

layout1.xml

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:id="@+id/my_linear_layout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">

    </LinearLayout>
</ScrollView>

LayoutInflater を使用して、親LinearLayoutに行項目を追加します。

private LinearLayout my_linear_layout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout1);
    my_linear_layout = (LinearLayout) findViewById(R.id.my_linear_layout);

    for(int i=1;i<=5;i++){
        View view = LayoutInflater.from(this).inflate(R.layout.layout2,null);
        TextView button1 = (TextView) view.findViewById(R.id.button1);
        Button button2 = (Button) view.findViewById(R.id.button2);
        TextView button3 = (TextView) view.findViewById(R.id.button3);

        button1.setText("HELLO " + i);
        button2.setText("HELLO "+i);
        button3.setText("HELLO "+i);
        my_linear_layout.addView(view);
    }
}
12
Haresh Chhelana

この方法を試してください

linearlayout layout1.xmlにIDを追加します

 <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:id="@+id/firstlayout"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:orientation="vertical" >

    </LinearLayout>

Oncreateで

    LinearLayout firstlayout=(LinearLayout)findviewbyId(R.id.firstlayout);

    LinearLayout secondlayoout=(LinearLayout)this.getLayoutInflater().inflate(R.layout.layout2,null); //inflating view from xml 
    TextView btn1=(TextView)secondlayoout.findviewbyId(R.id.button1);
    btn1.settext("TEST");

firstlayout.addview(secondlayoout);
4
Jitty Aandyan