Как создать пользовательский вид макета программно? - программирование
Подтвердить что ты не робот

Как создать пользовательский вид макета программно?

В Управлении вы можете создавать 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...

4b9b3361

Ответ 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