我试图创建一组视图(包含多个文本视图和按钮 - 全部在不同的父布局,但在同一个活动中)不可见如果特定条件被评估为假。
这样做的传统方法是:
findViewById(R.id.myview).setVisibility(View.INVISIBLE);
我的问题是,我是否必须逐一为所有观点执行此操作,我希望它们不可见,然后在我希望它们可见时将它们切换回来? 或者,有没有办法避免代码重复?
答案 0 :(得分:3)
如果View
位于不同的父级,则无法直接执行,但如果您愿意,可以实施一种方法来更改一堆View
的可见性保持代码清洁:
List<View> relatedViews = new ArrayList<>();
// ...
relatedViews.add(view1);
relatedViews.add(view2);
relatedViews.add(view3);
// ...
changeVisibility(relatedViews, View.INVISIBLE);
// ...
private void changeVisibility(List<View> views, int visibility) {
for (View view : views) {
view.setVisibility(visibility);
}
}
作为旁注,您可能希望将展示次数更改为View.GONE
而不是View.INVISIBLE
,因此它不会占用布局中的任何空间。
答案 1 :(得分:1)
这个想法是为每个视图提供您要隐藏相同内容的描述,因为在相同的布局中,您不能对多个视图使用相同的ID。使用相同的内容描述,您可以在布局中找到所有视图并隐藏它们。 这是一个将第一个布局视为线性的示例。你可以明显改变;)
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
LinearLayout rootLayout = (LinearLayout)findViewById(R.id.rootLayout);
int childcount = rootLayout.getChildCount();
for (int i=0; i < childcount; i++){
View v = rootLayout.getChildAt(i);
if(v.getContentDescription() != null && v.getContentDescription().equals("invisibleView")){
v.setVisibility(View.INVISIBLE);
//I suggest you to use GONE instead of INVISIBLE to remove the space of the view
}
}
}
}
你的xml中的给你想隐藏这个属性的对象
android:contentDescription="invisibleView"
答案 2 :(得分:0)
使用varargs
方法显示或隐藏多个视图。
例如,如果您有view1,view2 .....等视图
然后只需致电setVisibility(View.VISIBLE,view1,view2)
public static void setVisibility(int visibility, View... views){
for (View view : views){
view.setVisibility(visibility);
}
}