В чем разница между пользовательским представлением и представлением, которое оно раздувает в constructor?

#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 У тебя был какой-нибудь успех с этим?