Android – Fügen Sie Ansichten dynamisch zur Ansicht hinzu

Ich habe ein Layout für eine Ansicht

     

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

   

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

   

Verwenden Sie den LayoutInflater , um basierend auf Ihrer Layoutvorlage eine Ansicht zu erstellen, und LayoutInflater Sie sie dann in die Ansicht ein, in der 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 anpassen, an dem Sie die Ansicht einfügen möchten.

Legen Sie die LayoutParams darüber hinaus fest, wie sie in die übergeordnete Ansicht passen sollen. zB mit FILL_PARENT oder MATCH_PARENT usw.

Siehe die class 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); 

Es sieht so aus, als ob Sie wirklich ein ListView mit einem benutzerdefinierten Adapter möchten, um das angegebene Layout aufzublasen. Mit einem ArrayAdapter und der Methode notifyDataSetChanged() Sie die volle Kontrolle über die Generierung und das Rendering von Views.

Sehen Sie sich diese Tutorials an

Um die Antwort von @Mark Fisher klarer zu machen, sollte die eingefügte Ansicht, die aufgebläht wird, eine XML-Datei im Layout-Ordner sein, aber ohne ein Layout (ViewGroup) wie LinearLayout usw. darin. Mein Beispiel:

res / layout / meine_view.xml

 < ?xml version="1.0" encoding="utf-8"?>  

Dann sollte der Einfügepunkt ein Layout wie LinearLayout sein:

res / layout / activity_main.xml

 < ?xml version="1.0" encoding="utf-8"?>     

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 geposted habe, ist, dass ich, als ich versuchte, Marks Lösung zu implementieren, feststellte, welche XML-Datei ich für insert_point und die untergeordnete Ansicht verwenden sollte. Ich habe zuerst das Layout in der Kinderansicht verwendet und es funktionierte überhaupt nicht, was mich mehrere Stunden gekostet hat. Hoffe also, meine Erkundung kann die Zeit anderer retten.

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