#java #android #android-linearlayout
#java #Android #android-linearlayout
Вопрос:
Мы можем создать пользовательский компонент следующим образом:
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context) {
super(context);
doInflate();
}
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
doInflate();
}
// other constructors
public void doInflate(){
inflate(getContext(), R.layout.my_linear_layout_definition_xml, this);
this.setVisibility(GONE);
}
// some logic to show view
public void show(CustomObject o) {
if(o.someCondition()) return;
this.setVisibility(VISIBLE);
}
}
Если я управляю видимостью через this
в примере кода, который, я думаю, является ViewGroup
, представление никогда не отображается. Т.Е. this.setVisibility(VISIBLE);
не работает.
Но если в файле макета (my_linear_layout_definition_xml.xml ) У меня есть:
<LinearLayout android:id="@ id/my_linear_layout_parent_container"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone"
>
// other children views here...
И в коде, который я делаю вместо предыдущего фрагмента:
public void show(CustomObject o) {
if(o.someCondition()) return;
findViewById(R.id.my_linear_layout_parent_container)
.setVisibility(VISIBLE);
}
Видимость действительно работает. Т.Е. из gone становится видимой.
Итак, мой вопрос в том, почему это работает и какова связь / различие между тем, что my_linear_layout_parent_container
я раздуваю в конструкторе, и this
в моем классе?
Ответ №1:
Ваш ответ, по-видимому, противоречив, this.setVisibility (GONE) работает (потому что вы сказали, что представление не отображается), а this.setVisibility (VISIBLE) — нет? Вы также устанавливали видимость в xml?
Я попробовал это, и у меня это сработало. Нет разницы между this.setVisibility() и findViewById(…).setVisibility(), поэтому ваш код должен работать должным образом. Не могли бы вы уточнить, когда вы вызываете метод show (CustomObject o)? Вы уверены, что метод не возвращает в этом
if(o.someCondition) return
Пожалуйста, подробнее изложите свой вопрос, я отредактирую свой пост с ответом после того, как вы это сделаете, приветствия
Комментарии:
1. Нет, у меня не было заданной видимости в xml. Код в точности соответствует опубликованному. Почему вы говорите, что между
this
иfindViewById
нет разницы? Они относятся к разным элементам, верно? Какthis
правильноroot
?2. Джим, в твоем случае
this
иfindViewById
ссылаются на один и тот же элемент, насколько я понял из твоего кода. Вы раздули макет с помощьюinflate(getContext(), R.layout.my_linear_layout_definition_xml, this);
. Корневая viewgroup в этом —my_linear_layout_parent_container
, верно? Я полагаю, что компилятор понимает, чтоthis
в yout класс относится к представлению, которое вы раздули, то есть кmy_linear_layout_parent_container
линейной компоновке. Кроме того, из того, что я видел в вашем коде, вы устанавливаете видимость на gone, как только вы раздуваете макет; эта строка работает?3. @Jim У тебя был какой-нибудь успех с этим?