no-image

【Android Studio】Javaのフィールド – 間違った書き方

activity_main.xmlが読み込まれるより前にインスタンスを代入しようとすると失敗する

android studioのtextViewやButtonのフィールドへインスタンス代入する構文をonCreate()メソッドよりも前に書いてしまうと失敗するという話です。

public class MainActivity extends AppCompatActivity {

List list = new ArrayList(Arrays.asList(1,2,3,4));
Button button;
TextView textView;

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

button = (Button) findViewById(R.id.button1);
textView = (TextView) findViewById(R.id.textView);
for(int i : list){
textView.setText(“hello”);
}

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText(“ボタンがタップされました”);
button.setEnabled(false);
}
});
}
}

これは問題のないコードですが例えば、Buttonフィールドの宣言部を

Button button = (Button) findViewById(R.id.button1);

としてしまうと失敗します。ウィジェットのインスタンス代入はonCreate()メソッドで行う必要があるようです。またjavaのメンバーのアクセス修飾子はとくに設定しなかった場合はデフォルトの修飾子というものになるようです。その点を詳しく解説したサイトを発見しましたのでリンクを貼り付けておきます。

Javaのアクセス修飾子―public、protected、private、デフォルトなど

またフィールドを宣言したが、フィールドに値を設定しなかった場合はNullPointerExceptionというエラーが発生します。