Как установить layout_width / высоту от View конструктора - PullRequest
0 голосов
/ 07 апреля 2019

В пределах RecyclerView я создаю новые CustomView s и затем устанавливаю их параметры макета, например:

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    CustomView customView= new CustomView(parent.getContext() /*, ...otherCustomArgs*/);
    customView.setLayoutParams(new ViewGroup.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        ViewGroup.LayoutParams.WRAP_CONTENT
    ));
    // ...
}

Теперь я заметил, что существует довольно много конструкторов дляLinearLayout - класс, из которого расширяется мой CustomView.

/**
    {@link LinearLayout(Context)}
    {@link LinearLayout(Context, AttributeSet)}
    {@link LinearLayout(Context, AttributeSet, int)}
    {@link LinearLayout(Context, AttributeSet, int, int)}
*/

Теперь, очевидно, существует стандартный способ передачи ширины / высоты при создании экземпляра - через один из этих конструкторов, которыйкак layout_width/height из XML-макетов передается в класс.

Чтобы сохранить стандартность, я хочу использовать один из них в моем собственном конструкторе, а именно:

CustomView extends LinearLayout {
    CustomView(Context context, LayoutArgs layoutArgs, Object... otherCustomArgs){
        this(context, ...layoutArgs);
        // Use otherCustomArgs
    }
}

Я полагаю, поскольку этот пользовательский конструктор никогда не будет использоваться в макетах XML, нет необходимости соответствовать стандартной конструкции, но могут быть и другие вещи, которые конструкторы по умолчанию делают с XML layout_width/height, которых setLayoutParams не будет.

1 Ответ

1 голос
/ 07 апреля 2019

Согласно Макет, Атрибуты и Ваше сообщение в блоге :

Для изменения вещей по принципу «ребенок за ребенком» макеты используют другой механизм в виде атрибутов layout_, которые добавляются в дочерние представления. Эти атрибуты отличаются тем, что атрибуты layout_ являются инструкциями для родительской ViewGroup , а не для самого View.

Поэтому ваш CustomView не будет передавать вам параметры макета - они передаются в любой макет, в который вы добавляете свой CustomView. Затем родительский макет будет использовать эти значения для измерения и макета вашего CustomView.

...