16

działalność, można utworzyć LinearLayout programowo w następujący sposób:Jak programowo utworzyć niestandardowy układ widoku?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    ll.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

    TextView tv1 = new TextView(this); 
    tv1.setText("HELLO"); 
    ll.addView(tv1); 

    TextView tv2 = new TextView(this); 
    tv2.setText("WORLD"); 
    ll.addView(tv2); 

    setContentView(ll); 
} 

Jak zrobić to samo wewnątrz Widok niestandardowy podklasy? Brak setContentView lub onCreate metody ...

+0

może być [ten jeden] (http://stackoverflow.com/questions/14054197/how-to-get-na-nazwisko-tekstview-included-in-linear-layout-in-onclicklistener) –

+0

refer ten link http://stackoverflow.com/questions/14081339/how-can-i-declare-textview-as-global-variable-to-use-in-other-class/14081472#14081472 –

Odpowiedz

28

Ok, odkryłem jeden sposób to zrobić. Zasadniczo, zamiast podklasy klasy View bezpośrednio, musisz podklasować najwyższą klasę, którą normalnie zdefiniujesz w XML. Na przykład, jeśli niestandardowy widok wymaga LinearLayout jako najwyższej klasy, to niestandardowy widok powinien po prostu podklasować LinearLayout.

Na przykład:

public class MyCustomView extends LinearLayout 
{ 
    public MyCustomView(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 

     setOrientation(LinearLayout.VERTICAL); 
     setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); 

     TextView tv1 = new TextView(context); 
     tv1.setText("HELLO"); 
     addView(tv1); 

     TextView tv2 = new TextView(context); 
     tv2.setText("WORLD"); 
     addView(tv2); 
    } 
} 

Czy instacji LinearLayout "hack"? Nie tak daleko, jak to widzę. Niektóre oficjalne podklasy widoku działają tak samo, jak NumberPicker i SearchView (nawet jeśli nadpisują swoje układy z XML).

Po odbiciu jest to dość oczywista odpowiedź.

+1

Super odpowiedź, dziękuję! ! –

+1

bardzo interesujące –

0

Jeśli rozumiem Twoje pytanie, trzeba użyć inflate, tak:

public final class ViewHolder { 
     public TextView title; 
     public TextView artist; 
     public TextView duration; 
     public ImageView thumb_image; 
    //A class for the ViewHolder 

    } 

// Put this where you want to inflate this layout, could be a customlistview 
View view = getLayoutInflater().inflate(R.layout.your_layout, null); 
holder = new ViewHolder(); 
    holder.title = (TextView)view.findViewById(R.id.title); // title 
    holder.artist = (TextView)view.findViewById(R.id.artist); // artist name 
    holder.duration = (TextView)view.findViewById(R.id.duration); // duration 
    holder.thumb_image=(ImageView)view.findViewById(R.id.list_image); // thumb image 
Powiązane problemy