web-dev-qa-db-fra.com

Ajouter plusieurs vues personnalisées à la mise en page par programme

Si j'ai par exemple une mise en page vide comme celle-ci:

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>

Et une autre mise en page comme celle-ci:

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>

Je voudrais ajouter layout2.xml à layout1.xml par programme. J'aurais besoin de plusieurs versions différentes layout2.xml que j'ajouterais quand je veux. Chacun aurait un texte différent sur TextView et les boutons.

Dans le cas d'une vue régulière Android View, je le ferais généralement de la même manière avec 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);
}

Comment puis-je le faire si je n'ai pas quelque chose de simple comme TextView ou Button, et si j'ai ma propre vue définie par XML?

Serait-il possible de mettre en quelque sorte toutes les vues à l'intérieur de l'adaptateur comme pour un ListView, puis de l'obtenir en cas de besoin et d'appeler simplement addView sur ces vues?

26
user3304086

Vous pouvez gonfler le fichier layout2.xml, modifier les textes et l'ajouter à la première mise en page:

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

Vous voudrez peut-être modifier Android:layout_height de la vue racine layout2.xml vers wrap_content.

45
pdegand59

layout1 contient ScrollView comme disposition parent et LinearLayout principal comme enfant si aucun élément de ligne n'a plus de taille d'écran ScrollView gère l'élément de débordement avec défilement:

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>

Utilisez LayoutInflater pour ajouter un élément de ligne dans le LinearLayout parent:

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

essayez cette méthode

ajouter un identifiant à la mise en page linearlayout1.xml

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

En création

    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