浏览XML并将所有TextView设置为不可见

2 xml android invisible textview

嘿,这是我第一次尝试这样的事情,我不知道这是否接近最好的方法,但我觉得它会起作用.我正在尝试浏览XML布局文件并将所有内容设置TextView为INVISIBLE.当调用以下方法时,我得到一个NullPointerException

    public void numPlayerSetup(){
         {
             for(int i = 3; i <= 6; i++) 
                    for(int z = 2; z <= 10; z++){
                    int resID = getResources().getIdentifier("TextView"+Integer.toString(z) + Integer.toString(i), "id", this.getPackageName());
                    if(resID != 0){
                        TextView text = (TextView) this.findViewById(resID);
                        text.setVisibility(View.INVISIBLE);
                    }
        }
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议,请告诉我.谢谢!

kco*_*ock 6

嗯,ids会改变吗?如果没有,只需设置一个int [] TextView ID,然后循环遍历这些ID,例如:

int[] ids = {
    R.id.tv1, R.id.tv2, R.id.tv3 //...
}

for(int i : ids) {
    TextView tv = (TextView)findViewById(i);
    tv.setVisibility(View.INVISIBLE);
}
Run Code Online (Sandbox Code Playgroud)

我绝对不会尝试使用反射,它的效率远远低于以其他方式进行反射.如果您提前不知道TextView的ID,为什么不尝试这样的事情(假设您的根布局是RelativeLayout):

RelativeLayout root =(RelativeLayout)findViewById(R.id.root); for(int i = 0; i <root.getChildCount(); i ++){View v = findViewById(i); if(v instanceof TextView){((TextView)v).setVisibility(View.INVISIBLE); }}

既然你已经接受了,我会假设方法1有效,因为我刚刚意识到我在方法2上非常糟糕.它应该是getChildAt(i),而不是findViewById(i),因为那只是在调用findViewById(0|1|2|...etc).以下是更正后的版本:

RelativeLayout root = (RelativeLayout)findViewById(R.id.root);
for(int i = 0; i < root.getChildCount(); i++) {
    View v = root.getChildAt(i);
    if(v instanceof TextView) {
        ((TextView)v).setVisibility(View.INVISIBLE);
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有测试过,但理论上听起来不错.:)