2

嘿,这是我第一次尝试这样的事情,所以我不知道这是否接近最好的方法,但我认为它会起作用。我正在尝试浏览 XML 布局文件并将所有TextView's 设置为不可见。当调用以下方法时,我得到一个 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);
                    }
        }

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

4

3 回答 3

6

那么,id会改变吗?如果没有,只需设置一个 int[] 的 TextView 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);
}

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

相对布局根 = (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);
    }
}

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

于 2011-03-02T22:01:47.563 回答
0

你做了一些调试吗?例如,看看 resID 是否匹配。如果您的错误发生在那里,至少它们不是零。(你检查过吗?)。

听起来可能很奇怪,但您也可以检查 getResources() 和 this.findViewById() 是否引用同一个对象。

这就是我暂时能想到的。

于 2011-03-02T21:58:22.577 回答
0

正如其他人所指出的,NullPointerException 最明显的原因是您在调用 setVisibility() 之前没有检查文本是否为空。您首先需要研究为什么 text 会为空 - 但无论如何您都应该检查您的指针。

或者只是选择 kcoppock 的替代方案。

您使用 setVisibility 的任何特殊原因?它并不总是合适的——我相信它所做的只是阻止 draw 被调用,如果你希望将它视为已绘制但不可见,这可能会在以后引起问题。

于 2011-03-04T17:34:16.797 回答