2016-09-29 8 views
3

Ich füge mehrere View s per Code in Layout. Ich brauche jedes neue View über dem vorherigen (oben im Elternlayout).So legen Sie die Position der Ansicht während der Verwendung von addView fest

EDIT: Um genauer zu sein, werde ich beschreiben, was das App-Modul tun soll. Benutzer startet mit sauberem Bildschirm und einer Schaltfläche am unteren Bildschirmrand. Die Schaltfläche fügt oben auf dem Bildschirm eine View hinzu. Bei den nächsten Klicks sollten die nächsten Ansichten über die vorherigen hinzugefügt werden, damit die neueste View oben auf einem Container angezeigt wird. Die App speichert Status und beim Neustart Benutzer sehen Ansichten in der gleichen Reihenfolge.

+0

Was ist die Frage? Und was meinst du mit "über dem vorherigen"? Meinst du über die Spitze der vorherigen Ansicht? Oder meinst du das über der vorherigen Ansicht? Entschuldigung, aber Sie müssen wirklich genauer über das sein, was Sie erreichen wollen – SimonH

+0

Ich meine "über der vorherigen Ansicht platziert". Ich lade einige Daten aus der Datenbank und ich möchte, dass sie nach dem neuesten Datensatz sortiert werden. Es ist kein Problem, weil ich es vom Ende der Liste laden kann.Aber später, wenn der Benutzer die nächste Ansicht dynamisch hinzufügt, sollte er oben im Rest erscheinen. Das ist der Geist der Frage. – Gniewomir

Antwort

3

Rufen Sie die folgende Methode von Button onClick Event.

private final int LAYOUT_TOP_INDEX = 0; 

private void addViewOnTop(View view){ 
    if(layout != null && view !=null) 
     layout.addView(view, LAYOUT_TOP_INDEX); 
} 

wo 'Layout' Ihr Layout ist (zum Beispiel Linearlayout), auf die die Ansicht hinzugefügt werden soll.

1

Benötigen Sie wirklich mehr Informationen von Ihnen, um eine genauere Antwort zu geben, aber wenn Sie sagen, was ich denke, Sie sind dann können Sie diese Ansichten zu einem LinearLayout mit Ausrichtung auf vertikal.

Und vorausgesetzt, Sie durchlaufen eine Liste zum dynamischen Hinzufügen von Sichten, statt von 0 zu erhöhen, erhöhen Sie die Größe der Liste.

for(int i = size; i >= 0; i--){ 
    linearLayout.add(new TextView(Context)); 
} 
+0

Es ist okay, aber ich gebe dir nicht genug Details, also ist deine Antwort etwas verfehlt. – Gniewomir

0

Wenn Sie meinen, eine Ansicht programmatisch hinzugefügt, so dass die neue über vorherigen hinzugefügt wird, statt darunter, dann schlage ich dies:

  • eine Arraylist pflegen mit den Einzelteilen Sie wollen in Ansichten
  • Setzen Sie sie in ein ListView
  • Wenn Sie eine neue Ansicht hinzufügen möchten, die an der Spitze der Liste angezeigt werden muss, fügen Sie es als das erste Element Ihrer ArrayList und erstellen Sie die ListView daraus.
+0

Das würde funktionieren, aber ich wollte die Verwendung von ListView vermeiden. Die gewählte Antwort funktionierte in meinem Fall am besten. – Gniewomir

1

View Positionen innerhalb ViewGroup s durch die LayoutParams

definiert sind, wie kommt das? Ansichten geben ihre LayoutParams an ihre Mutter ViewGroups

//100% programatic approach with simple LayoutParams 
       LinearLayout myLinearLayout = new LinearLayout(this); 

    //if the **parent** of the new linear layout is a FrameLayout 
       FrameLayout.LayoutParams layoutParams = 
new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT); 

       //or if you have the XML file you don't have to worry about this 
       //myLinearLayout = (LinearLayout)findViewById(R.id.my_simple_linear_layout); 


       //you could have a LinkedList<TextView> 
       LinkedList<TextView> textViewList = new LinkedList<>(); 


       //assuming the order is the correct order to be displayed 
       Iterator<TextView> descendingIterator = textViewList.descendingIterator(); 

       while(descendingIterator.hasNext()) 
       { 
        //just add each TextView programatically to the ViewGroup 
        TextView tView = descendingIterator.next(); 
        myLinearLayout.addView(tView); 
       } 

Genau wie wir LayoutParams für die LinearLayout definiert konnten wir auch LayoutParams für die

WICHTIG TextView

definieren: Wenn LayoutParams Einstellung, die Sie müssen sicher sein, sie passen die Viewgroup, das ist die Mutter der Ansicht

hinzugefügt wird
private TextView textViewFactory(String myText) { 


      TextView tView = new TextView(getBaseContext()); 

      //controling the position relatively to the PARENT 
      //because you are adding the textview to a LINEAR LAYOUT 
      LinearLayout.LayoutParams paramsExample = 
        new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, 
          LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f); 

      tView.setLayoutParams(paramsExample); 


      //configuring the insides of the textview 
      //you can also do all kinds of stuff programatically 
      tView.setGravity(Gravity.CENTER_HORIZONTAL); 

      tView.setPadding(10, 10, 10, 10); 
      tView.setTypeface(Typeface.DEFAULT_BOLD);// (null, Typeface.BOLD_ITALIC); 
      tView.setTypeface(Typeface.SANS_SERIF); 
      tView.setTypeface(null, Typeface.ITALIC); 
      tView.setTypeface(Typeface.defaultFromStyle(R.style.AppTheme)); 
      tView.setId(R.id.aux_info); 

      tView.setText(myText); 
      //.........all kinds of stuff really 

      return tView; 
    } 
+1

@Gniewomir Ich sah nur die Bearbeitung nach der Antwort, wollen Sie auch den vollständigen Code für die Schaltfläche? – HenriqueMS

+1

Das sollte genug sein, ich werde deine Antwort heute testen. Danke für die schöne Antwort. – Gniewomir

+1

@Gniewomir in Ordnung dann;) Wenn Sie auf irgendein Problem mit dem Code stoßen lassen Sie mich wissen oder markieren Sie die Antwort als akzeptiert bitte =) – HenriqueMS

Verwandte Themen