2

こんなことを試すのは初めてなので、これがこれを行うための最良の方法に近いかどうかはわかりませんが、うまくいくと思いました. TextViewXML レイアウト ファイルを調べて、すべての を 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);
                    }
        }

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

4

3 に答える 3

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 root = (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); } }

あなたはすでに受け入れているので、方法 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

他の人が示したように、NullPointerException の最も明白な原因は、setVisibility() を呼び出す前にテキストが null かどうかをチェックしていないことです。そもそもテキストが null になる理由を調べたいと思うでしょうが、とにかくポインターをチェックする必要があります。

または、kcoppock の代替案を使用してください。

setVisibility を使用している特定の理由はありますか? 常に適切であるとは限りません. draw が呼び出されないようにするだけで、描画されているが見えないものとして扱いたい場合、後で問題が発生する可能性があると思います.

于 2011-03-04T17:34:16.797 に答える
0

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

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

とりあえず思いつくのはこれくらいです。

于 2011-03-02T21:58:22.577 に答える