2017-05-23 3 views
0

リスナーからローカル最終変数にアクセスするにはnullが必要ですか?我々は、以下のいる

finalonClick方法でアクセスすることはできませんされていない限り、
final TextView view = (TextView) layout.findViewById(R.id.some_view); 

button.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) {  
     view.setText(“blah”);  
    } 
} 

//など

view
このスニペットがメソッド内にある場合は、viewがヒープへの参照を保持するスタックに割り当てられます。したがって、メソッド呼び出しの最後にはviewが失われます。 onClickが同じスコープにあるため、viewは引き続き表示されます。私の質問は:onClickはいつでも呼び出すことができます。 finalとマークすると、リスナーの実行時にviewがnullにならないようにしますか?またはnullが必要かどうかチェックしていますか?それはなぜですか?

+0

*最終としてそれをマークするには、リスナーが実行時にそのビューがnullではないだろうことを確認しますか?*もちろん... 'layout.findViewById(R.id.some_viewが)'まだヌル – Selvin

+0

を返すことがありません@セルバン:しかし、私はリスナーでそれを呼び出すことはしません – Jim

+0

finalはヌルチェックとは関係ありません... 'final Object name = null;'かなり有効です... 'layout.findViewById(R.id.some_view) ; '返されたnullは明らかに' view'がnullになる可能性があります – Selvin

答えて

0

レイアウトにR.id.some_viewが含まれていない場合、findViewById()がnullを返す可能性があります。だから、おそらくnullをチェックする必要があります。 nullをチェックする場所は、アプリのロジックによって異なります。匿名のOnClickListenerオブジェクトは内側の "view"コピーを作成します。したがって、外側の "view"がスコープから外れても、リスナーは "view"変数への参照を保持します。 nullをチェックする場所はあなたの選択ですが、FindById()がnullを返した場合、おそらくリスナーをクリックして作成するべきではありません。

0

私はあなたの最終コードをテストしました

しかし、このTextviewはnullではありません。あなたはTextViewのレイアウトをチェックする必要がTextViewの

はたぶんレイアウトはありません。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R 
      .layout.activity_main); 

    Button button =(Button)findViewById(R.id.button); 
    final TextView view = (TextView)findViewById(R.id.some_view); 
    button.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      view.setText("Hello world"); 
     } 
    }); 

} 
関連する問題