2011-03-02 8 views
2

これは私の最初のようなものなので、これを実行する最善の方法に近いのか分かりませんが、うまくいくと思いました。私はXMLレイアウトファイルを調べ、すべてTextViewを非表示に設定しようとしています。次のメソッドが呼び出されると、NullPointerExceptionが返されます。XMLを介してすべてのTextViewを非表示に設定する

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); 
        } 
     } 

提案があれば教えてください。ありがとう!

+0

あなたは目に見えないものにしようとしているTextViewのIDを知りませんか? –

答えて

6

IDは変更されますか?ない場合は、単に[]のTextView IDのINTを設定し、例えばそれらを通してループ:

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

for(int i : ids) { 
    TextView tv = (TextView)findViewById(i); 
    tv.setVisibility(View.INVISIBLE); 
} 

私は間違いなく、リフレクションを使用してみないと、それははるかに少ない効率的な他の方法でそれを行うよりもなるだろう。あなたが前もってTextViewsのIDを知らない場合は、なぜ(あなたのルートレイアウトがRelativeLayoutであると仮定して)このような何かを試してみません:

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

すでに受け入れられてきたので、私はちょうどそれだけで呼び出すことになるとして、私は、それはgetChildAt(i)、ないfindViewById(i)あるべき方法2に恐ろしくオフに気づいたので、方法1は、働いていたと仮定します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

あなたは大歓迎です! 2番目の方法では、私は自分の投稿を訂正して更新しました。 :) – kcoppock

+0

ハ私は最初の方法を使用しました。私は2番目の方法を試みるかもしれませんが、私はIDがちょうどそれらの多くがあることを知っています! –

0

デバッグをしましたか? たとえば、resIDが一致するかどうか調べてください。エラーが発生した場合は、少なくともゼロではありません。 (あなたはそれをチェックしましたか?)。

奇妙に聞こえるかもしれませんが、getResources()とthis.findViewById()が同じオブジェクトを参照しているかどうかを確認することもできます。

これは私が今考えているすべてのことです。

0

他の人が指摘したように、NullPointerExceptionの最も顕著な原因は、setVisibility()を呼び出す前にtextがnullかどうかをチェックしていないことです。なぜテキストが最初にヌルになるのかを調べたいと思うでしょうが、あなたはポインタをチェックする必要があります。

または、kcoppockの代替手段にしてください。

setVisibilityを使用している特別な理由は何ですか?それは常に適切ではない - 私はそれが描画されているが、描画されているが見えないようにそれを扱うことを望んでいる場合は、後で問題を引き起こす可能性があります引き分け続けることだと思う。

+0

Nathan、いいえ特に私はsetVisibilityを使用しています。私はそれがおそらく最も簡単な方法だと思った以外は。 –

+0

私はNullPointerExceptionがどこから来ているのか分かりました。Spinnerとそのクラッシュから特定の項目が選択されたときに別のクラスからこのメソッドを呼び出していますが、クラス内のメソッドを呼び出すとそのメソッドが機能します。私はスピナーについてあまり知らないので、もし彼らと特別な何かをする必要があれば私に知らせてください。そうでない場合、私はそれを理解することができるはずです、私は確かに私の部分でその愚かな間違いです。ありがとう –

関連する問題