LoginSignup
3
3

More than 5 years have passed since last update.

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

Posted at

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

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

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>

やる事をやるだけの場合、これだけ

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()内だけ。

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っていう注意や警告を出す為のダイアログがあるんだけど、どういったものかは見た方が早いはずだからまずは見てくれ。
error_dialog.jpg
上記の処理でわざとエラーが出るように仕向けた場合こんな感じになる。表記は遊びだから真に受けないように!

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

ちなみに正しく入力するとこんな感じになる。
correct_input.jpg

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

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に表示:

KotlinActivity.kt
button.setOnClickListener{ textView.text = editBox.text }

・上のお遊びを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は凄くスッキリ書ける。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3