Как создать пользовательский вид макета программно?
В Управлении вы можете создавать LinearLayout программно следующим образом:
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);
}
Как вы делаете то же самое внутри пользовательского подкласса View? Нет методов setContentView
или onCreate
...
Ответы
Ответ 1
Хорошо, я обнаружил один из способов сделать это. В принципе, вместо того, чтобы подклассифицировать класс View непосредственно, вам нужно подклассифицировать самый верхний класс, который вы обычно определяете в XML. Например, если ваш пользовательский вид требует LinearLayout как самого высшего класса, тогда ваш пользовательский вид должен просто подклассифицировать LinearLayout.
Например:
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);
}
}
Является ли подклассом LinearLayout "взломать"? Не настолько, насколько я вижу. Некоторые официальные подклассы View аналогичны, например NumberPicker и SearchView (хотя они раздувают их макеты из XML).
При отражении это на самом деле довольно очевидный ответ.
Ответ 2
Если я понимаю ваш вопрос, вам нужно использовать надувание, например:
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