2014-11-25 12 views
15

Gdybym na przykład mieć pusty układ takiego:Dodaj wiele widoków niestandardowych układ programowo

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> 

i niektórych innych Layout tak:

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> 

Chciałbym dodać layout2.xml do layout1.xml p rogrammatycznie. Musiałbym mieć wiele różnych wersji layout2.xml, które chciałbym dodać, kiedy chcę. Każdy miałby inny tekst na TextView i przyciski.

W przypadku regularnego Android View ja zwykle zrobić podobnie jak ten z 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); 
} 

Jak mogę to zrobić, jeśli nie mam coś prostego jak TextView lub przycisk, a jeśli mam mój własny zdefiniowany xml View?

Czy byłoby możliwe umieszczenie wszystkich widoków wewnątrz adaptera, jak w przypadku ListView, a następnie uzyskanie go w razie potrzeby i wystarczy zadzwonić pod numer addView w tych widokach?

+0

Korzystanie LayoutInflator to zrobić Zobacz http://stackoverflow.com/questions/2335813/how-to-inflate -jeden-widok-z-układem – user3917131

Odpowiedz

32

można nadmuchać plik layout2.xml, edytować teksty i dodać go do pierwszego układu:

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

Możesz zmienić android:layout_height widoku głównego layout2.xml do wrap_content.

7

Układ1 zawierać Scrollview jako układu nadrzędnego i głównego LinearLayout jako dziecko, gdy żaden element rząd bardziej rozmiar ekranu uchwyt Scrollview element przelewowy z przewijaniem:

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> 

Zastosowanie LayoutInflater dodać wiersz pozycja w rodzicu 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); 
    } 
} 
+0

jak uzyskać dostęp do wszystkich przycisków poza widokiem? –

+0

Spróbuj uzyskać dziecko z my_linear_layout lub dodaj wszystkie przyciski odwołujące się do jednej listy tablic. –

+0

Określone dziecko ma już rodzica, wywołaj removeView() –

2

wypróbuj tę metodę

dodać id do linearlayout layout1.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> 

W 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); 
Powiązane problemy