今回はEditTextを使ってみる。EditTextというのは文字を入力する為のViewである。
やる事:「Buttonを押したらEditTextに入力された内容に応じてなんかする」
用意したレイアウトはこんな感じ。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_gravity="center_horizontal"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:orientation="horizontal">
<EditText
android:id="@+id/editBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go" />
</LinearLayout>
</LinearLayout>
やる事をやるだけの場合、これだけ
public class MainActivity extends AppCompatActivity{
TextView textView;
EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.editor_layout);
textView = findViewById(R.id.textView);
editText = findViewById(R.id.editBox);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
textView.setText(editText.getText().toString());
}
});
}
}
EditTextに入力された文字の取得は上記に当てはめると、**editText.getText().toString()**となる。
##以降はお遊び:
さて、やることはやったけど、これだけだと**つまんねぇ!!!**ので、遊んでみます。
やる事: EditTextにHint(よくある検索みたいな表記)を設定して、ユーザーに「文字を入れてね」と指示する。指示通りにしてくれなかったら怒ってみる。
レイアウトはそのまんまでOK。Activity側も変えるのはonClick()内だけ。
try {
Integer.parseInt(editText.getText().toString());
new AlertDialog.Builder(MainActivity.this).setMessage(R.string.input_error).setPositiveButton(R.string.sorry, null).show();
} catch (NumberFormatException e) {
textView.setText(String.format("%s%s", editText.getText().toString(), getString(R.string.result_string)));
}
これの肝は入力された内容が数字であるかを判定してるところにある。
onClick()内のtry文は例外(エラー)が発生する可能性がある処理を行う場合に、例外が発生してもアプリをクラッシュさせずに起きた例外を回収する役割を持つ。
今回のケースは入力された内容を数字へと変換する試みを行い、エラーが発生すれば文字のみ、エラーが発生しなければ数字のみと言った形で判定を行なっている。
あんまり綺麗なやり方でないが、isNum()等、綺麗にできるやり方がないんだし、遊びだから深くは考えない。(Character.isDigit()みたいなやり方もあるっちゃある
この中でAlertDialogっていう注意や警告を出す為のダイアログがあるんだけど、どういったものかは見た方が早いはずだからまずは見てくれ。
上記の処理でわざとエラーが出るように仕向けた場合こんな感じになる。表記は遊びだから真に受けないように!
今回は使ってないが、**.setTitle()でタイトルを設定できたり、.setNegativeButton(文字, リスナー)**を設定して、はい・いいえ、OK・Cancelとかの選択式のダイアログを出す事も可能
こんな使い方もある:**addTextChangedListener(リスナー)**を設定して入力された文字を監視。今回は説明しないので気になる人は調べてね
editBox.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence charSequence, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {
}
});
##おまけ: これらをKotlinで書いたらどうなるか
・ボタンを押したらEditTextの内容をTextViewに表示:
button.setOnClickListener{ textView.text = editBox.text }
・上のお遊びをKotlinで!
class KotlinActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.editor_layout)
editBox.hint = getString(R.string.input_string)
button.setOnClickListener {
when(editBox.text.toString().toIntOrNull()){
null -> result.text = String.format("%s%s", editBox.text, getString(R.string.result_string))
else -> AlertDialog.Builder(this).apply {
setMessage(R.string.input_error)
setPositiveButton(R.string.sorry, null)
show()
}
}
}
}
}
キーポイントはKotlinのwhen文で、これはプログラミング言語でよく見るif文とswitch文を合体させたような感じ。
ここでは数値判定に**.toIntOrNull()**というKotlinのメソッドを用いてるのがJavaと違うところ。EditTextの内容の変換を試みてnull(失敗)なら、その他(このケースだと成功)なら、と言った感じで条件分散をしている。
Kotlinは書き方がJavaと結構違うので、分からない部分が多いと思うが、使いこなすとKotlinは凄くスッキリ書ける。