2017-07-07 12 views
0

次の問題が発生しました。ユーザーがUIでメニュー項目をクリックした後、これらを実行しますアクティビティでfindViewByIdを呼び出すタイミング

Spinner domainSpinner = (Spinner) findViewById(R.id.domain); 
domainSpinner.setVisibility(View.VISIBLE); 

: は、私は次のコード行を持っています。だから私はUIが画面に描かれていることを確信しています。スピナーは画面上にあり、既にデータで満たされている必要があります。 メニュー項目は、画面の言語を変更することです。スピナーは、新しく選択された言語の項目でいっぱいにする必要があります。

GooglePlayでは、2行目にstackTraceがNullPointerExceptionを返すエラーレポートが表示されることがあります。したがって、domainSpinnerがnullである必要があります。

私はこの問題を自分で経験したことがありません。また、私たちは自分のためにベータ版のアプリケーションを使用していますが、私の同僚の誰もこの問題を抱えていません。

findViewByIdがnullを返すことがある理由がわかりません。私は前進、前進、回転を試みました....しかし、私はこの問題は決してありません。

R.id.domainという項目は、GONEの可視性をプログラムで設定できることに注意してください。しかし、私もこれで遊んだが問題を再現できませんでした。メニュー項目のアクションの

コード:

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    int id = item.getItemId(); 
    if (id == R.id.action_nl) 
    { 
     changeLanguage("nl", true); 
     return true; 
    } 
    else if (id == R.id.action_fr) 
    { 
     changeLanguage("fr", true); 
     return true; 
    } 
    else if (id == R.id.action_en) 
    { 
     changeLanguage("en", true); 
     return true; 
    } 
    else if (id == R.id.action_de) 
    { 
     changeLanguage("de", true); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 

}

+0

ボタン上でonClickListenerを設定するコードスニペットを共有してください。 –

+0

"onPause"コールの後にコードセグメントが呼び出される可能性はありますか?おそらく、いくつかの非同期メカニズムを介して。 – DeeV

+0

は、何らかの種類の競合状態である可能性があります。いくつかのデバイスでは、スピナービューはまだ呼び出されているときにビューツリーに追加されません。 –

答えて

1

アクティビティのOnCreateメソッドでビューを初期化すると、ビューを参照するときにそのビューが存在することを確認する必要があります。 以下のように:

private Spinner domainSpinner; 

@Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     domainSpinner = (Spinner) findViewById(R.id.domain); 
    } 

これが役立つ場合はお知らせください。

更新:on createメソッドの外で変数を使用する必要がある場合は、グローバル変数を宣言し、作成時にそれを初期化してから、必要に応じて使用します。

+0

これを前に読んだことがありますが、これは実際には避けています。なぜなら、デバイス変数が静的変数であっても、デバイスがスリープ状態になり、アンドロイドがメモリをクリアすると、メンバー変数がnullになるからです。私はこれを自分自身で見てきました。もしあなたがアンドロイドのメンバ変数がヌルになったり、アンドロイドのスタティックヌルになったりしたら、この問題を抱える多くの人が見つかります。 – Knarf

+0

私はこのanwserを実装し、何が起こるかを1週間見ていきます... – Knarf

0

あなたはこれを試すことができます。 domainSpinnerがメインスレッドで初期化されていることを確認します。また、domainSpinnerがnullと等しくない場合にのみ可視性を設定するための条件を追加します。

Handler mainHandler = new Handler(context.getMainLooper()); 
mainHandler.post(new Runnable() { 

    @Override 
    public void run() { 
     Spinner domainSpinner = (Spinner) findViewById(R.id.domain); 
     if(domainSpinner!=null) { 
      domainSpinner.setVisibility(View.VISIBLE); 
     } 
    } 
}); 
関連する問題