レイアウトxmlファイル
<EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" />
javaファイル
package com.example.edittext; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText = (EditText) findViewById(R.id.editText1); Button button = (Button) findViewById(R.id.button1); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String str = editText.getText().toString(); Toast.makeText(MainActivity.this, str + "を選択しました。", Toast.LENGTH_SHORT).show(); } }); } }
さて基本的にはTextViewと同じ流れですが、特筆すべきは18行目と25行目でしょう。
なぜ25行目の処理を19行目に記述していないのでしょうか?
これは処理の問題です。
実はonCreate()内には初期化処理等を記述します。(詳細は後述の「Activityのライフサイクル」を参照)
したがって、EditTextのインスタンス化は18行目で問題がないのですが、「入力された値をString型に変換して、変数strに代入する」というロジックをここに記述してしまうと、値を取得できません。
簡単な流れをイメージすると・・・
- アプリを起動する
- 初期化処理(18~21行目)が実行される
- EditTextに文字が入力される
- Buttonがクリックされたときに、24行目のコールバックメソッドが実行される。
- 25行目でEditTextに入力された内容をString型に変換する
- 27行目で、変換されている入力内容をToast内に表示させる
このような流れになります。
つまり24行目のコールバックメソッドであるonClick()の外は、onCreate()内であるため、ここに記述する内容は初期化処理ということになります。したがって、このような順番になります。いかがでしょうか?イメージができればそこまで難しい話ではありませんね。
[clearboth]