it-swarm.com.de

Android - Ansichten dynamisch zur Ansicht hinzufügen

Ich habe ein Layout für eine Ansicht -

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

    <TextView
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/items_header"
        style="@style/Home.ListHeader" />

    <TextView 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/items_none"
        Android:visibility="gone"
        style="@style/TextBlock"
        Android:paddingLeft="6px" />

    <ListView 
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/items_list" />


</LinearLayout>

Was ich tun möchte, ist in meiner Haupttätigkeit mit einem Layout wie diesem

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:padding="0px"
    Android:id="@+id/item_wrapper">
</LinearLayout>

Ich möchte mein Datenmodell durchlaufen und mehrere Ansichten, die aus dem ersten Layout bestehen, in das Hauptlayout einfügen. Ich weiß, dass ich das tun kann, indem ich die Steuerelemente vollständig im Code erstelle, aber ich habe mich gefragt, ob es eine Möglichkeit gibt, die Ansichten dynamisch zu erstellen, damit ich weiterhin ein Layout verwenden kann, anstatt alles in Code zu schreiben.

139
Josh

Verwenden Sie LayoutInflater , um eine Ansicht basierend auf Ihrer Layoutvorlage zu erstellen, und fügen Sie sie dann in die Ansicht ein, wo Sie sie benötigen.

LayoutInflater vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.your_layout, null);

// fill in any details dynamically here
TextView textView = (TextView) v.findViewById(R.id.a_text_view);
textView.setText("your text");

// insert into main view
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.insert_point);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));

Möglicherweise müssen Sie den Index an der Stelle anpassen, an der Sie die Ansicht einfügen möchten.

Stellen Sie außerdem die LayoutParams so ein, wie Sie möchten, dass sie in die übergeordnete Ansicht passen. z.B. mit FILL_PARENT, oder MATCH_PARENT, usw.

215
Mark Fisher

Siehe die Klasse LayoutInflater .

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ViewGroup parent = (ViewGroup)findViewById(R.id.where_you_want_to_insert);
inflater.inflate(R.layout.the_child_view, parent);
34
Gabriel Negut

Es sieht so aus, als ob eine ListView mit einem benutzerdefinierten Adapter das angegebene Layout aufblähen soll. Mit einem ArrayAdapter und der Methode notifyDataSetChanged() haben Sie die volle Kontrolle über die Erzeugung und das Rendern von Views.

Schauen Sie sich diese Tutorials an

19
Aleadam

Um die Antwort von @Mark Fisher klarer zu machen, sollte die eingefügte Ansicht, die aufgeblasen wird, eine XML-Datei unter dem Layoutordner sein, jedoch ohne ein Layout (ViewGroup) wie LinearLayout usw. im Inneren. Mein Beispiel:

res/layout/my_view.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/i_am_id"
    Android:text="my name"
    Android:textSize="17sp"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_weight="1"/>

Dann sollte die Einfügemarke ein Layout wie LinearLayout sein:

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/aaa"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:id="@+id/insert_point"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">

    </LinearLayout>

</RelativeLayout>

Dann sollte der Code sein

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_shopping_cart);

    LayoutInflater inflater = getLayoutInflater();
    View view = inflater.inflate(R.layout.my_view, null);
    ViewGroup main = (ViewGroup) findViewById(R.id.insert_point);
    main.addView(view, 0);
}

Der Grund, warum ich diese sehr ähnliche Antwort poste, ist, dass ich bei dem Versuch, Marks Lösung zu implementieren, nicht mehr wusste, welche XML-Datei ich für insert_point und die untergeordnete Ansicht verwenden sollte. Ich habe Layout zuerst in der Kinderansicht verwendet und es hat überhaupt nicht funktioniert, was mich mehrere Stunden gekostet hat, um es herauszufinden. Ich hoffe, meine Erkundung kann anderen Zeit sparen.

11
York Yang
// Parent layout
LinearLayout parentLayout = (LinearLayout)findViewById(R.id.layout);

// Layout inflater
LayoutInflater layoutInflater = getLayoutInflater();
View view;

for (int i = 1; i < 101; i++){
    // Add the text layout to the parent layout
    view = layoutInflater.inflate(R.layout.text_layout, parentLayout, false);

    // In order to get the view we have to use the new view with text_layout in it
    TextView textView = (TextView)view.findViewById(R.id.text);
    textView.setText("Row " + i);

    // Add the text view to the parent layout
    parentLayout.addView(textView);
}
1
Tienanhvn