Пройдите через XML и сделайте все TextView невидимыми - PullRequest
2 голосов
/ 03 марта 2011

Эй, я впервые пробую что-то подобное, поэтому я не знаю, насколько это близко к лучшему способу сделать это, но я думал, что это сработает.Я пытаюсь просмотреть файл макета XML и установить для всех TextView значение НЕВИДИМ.Когда вызывается следующий метод, я получаю исключение 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);
                    }
        }

Дайте мне знать, если у вас есть какие-либо предложения.Спасибо!

Ответы [ 3 ]

6 голосов
/ 03 марта 2011

Ну, идентификаторы собираются изменить? Если нет, просто установите int [] идентификаторов TextView и выполните цикл, например ::

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 заранее, почему бы не попробовать что-то вроде этого (при условии, что ваш корневой макет является RelativeLayout):

RelativeLayout root = (RelativeLayout) findViewById (R.id.root); for (int i = 0; i

Так как вы уже приняли, я предполагаю, что метод 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);
    }
}

Я не проверял это, но в теории это звучит хорошо. :)

0 голосов
/ 04 марта 2011

Как указали другие, наиболее очевидной причиной исключения NullPointerException будет то, что вы не проверяете, является ли текст нулевым, перед вызовом setVisibility (). Вы захотите выяснить, почему текст был бы нулевым в первую очередь, но вы должны проверить свои указатели в любом случае.

Или просто воспользуйтесь альтернативой kcoppock.

Есть какая-то конкретная причина, по которой вы используете setVisibility? Это не всегда уместно - я полагаю, что все, что он делает - это удерживает ничью от вызова, что может вызвать проблемы позже, если вы надеетесь рассматривать его как нарисованный, но невидимый.

0 голосов
/ 03 марта 2011

Вы делали некоторую отладку? Например, посмотрите, совпадают ли идентификаторы resID. По крайней мере, они не равны нулю, если ваша ошибка возникает прямо здесь. (Вы это проверяли?).

Это может звучать странно, но вы также можете проверить, ссылаются ли getResources () и this.findViewById () на один и тот же объект.

Это все, что я могу думать на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...