Androidアプリ開発 EditText 文字の入力 おまけでKotlin有り

今回は**EditText**を使ってみる。EditTextというのは**文字を入力する為のView**である。
やる事：「**Buttonを押したらEditTextに入力された内容に応じてなんかする**」

用意したレイアウトはこんな感じ。

```xml:editor_layout.xml
<?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>
```
やる事をやるだけの場合、これだけ

```java:MainActivity.java
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()内だけ。

```java:MainActivity.java
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**っていう注意や警告を出す為のダイアログがあるんだけど、どういったものかは見た方が早いはずだからまずは見てくれ。
<img width="431" alt="error_dialog.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/245077/97f49c5e-192d-7e30-105a-4044ccaab48d.jpeg">
上記の処理でわざとエラーが出るように仕向けた場合こんな感じになる。**表記は遊びだから真に受けないように！**

今回は使ってないが、**.setTitle()**でタイトルを設定できたり、**.setNegativeButton(文字, リスナー)**を設定して、はい・いいえ、OK・Cancelとかの選択式のダイアログを出す事も可能

ちなみに正しく入力するとこんな感じになる。
<img width="431" alt="correct_input.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/245077/11a4b42b-8e3b-9228-7ec3-2ac4a91d77bd.jpeg">

**こんな使い方もある**：**addTextChangedListener(リスナー)**を設定して入力された文字を監視。今回は説明しないので気になる人は調べてね

```java:MainActivity.java
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に表示:

```kotlin:KotlinActivity.kt
button.setOnClickListener{ textView.text = editBox.text }
```
・上のお遊びをKotlinで！

```kotlin:KotlinActivity.kt
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は凄くスッキリ書ける。