次にEditTextクラスを学んでいきます。
EditTextクラスに関してはユーザーがテキストを入力する事ができるエリアになっており。ユーザーが入力された値を取得する事が簡単にできるクラスになっています。
アンドロイドでは、
1、クリックでテキスト入力
2、テキスト入力時のイベントの送出
の2点をチェックボックスが自動で行ってくれます。
作り方
最初にeTextというプロジェクトを作成します。
作成が完了したら、main.xmlのファイルを開きます。
※main.xmlでは【graphical layout】で作業を行うと簡単にレイアウトの変更ができます。
TextViewクラスがデフォルトで中に配置されていると思いますが、削除をします。
次に、項目の中からEditTextをドラッグして、main.xmlの中にいれます。
今回のEditTextの確認の為にTextFiedクラスを新たに作成をして追加して、LinerLayoutの中にいれます。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <EditText android:text="EditText" android:id="@+id/editText1" android:layout_height="wrap_content" android:layout_width="fill_parent" android:paddingTop="10sp"></EditText> <TextView android:text="TextView" android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </LinearLayout>
上記のようなmain.xmlになっているかと思います。もしidなどがなければ必要になりますので、追加をしておいてください。
ここで一度パブリッシュをしてみてください。
パブリッシュされたアプリで、EditTextをクリックすると、テキスト編集画面が出るのがわかります。自動で、EditTextが作成されました。
では、続いて、編集した文字をスクリプトで取得をしてみましょう。
まず、最初に行うのは配置したオブジェクトを読み込む為の変数を用意します。
private EditText _editText; private TextView _textView;
次にコンストラクタで、この変数にオブジェクトを読み込みます。
_editText = (EditText)findViewById(R.id.editText1); _textView = (TextView)findViewById(R.id.textView1);
エディットイベントを取得する為には、OnEditorActionListenerをimplementsする必要があり、イベントをEditTextに結びつける必要があります。
イベントが取得された際にonEditorActionが実行されますが、このイベントに関してはENTERキーを押した時に発動。と言う仕様になっており、とても使いづらいイベントになっています。
なので、値が必要になった時に応じて、getText()で値を取得できるので、このイベントは強いて使う必要はないかもしれません。
package andante.in.android.etext; import android.app.Activity; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.KeyEvent; import android.widget.EditText; import android.widget.TextView; import android.widget.TextView.OnEditorActionListener; public class eText extends Activity implements OnEditorActionListener{ /** Called when the activity is first created. */ private EditText _editText; private TextView _textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); _editText = (EditText)findViewById(R.id.editText1); _textView = (TextView)findViewById(R.id.textView1); _editText.setOnEditorActionListener(this); } public boolean onEditorAction(TextView testview, int id, KeyEvent keyEvent) { _textView.setText(_editText.getText()); return true; } }
使いにくいイベントとは裏腹におくだけで簡単に利用できるEditTextはとても使いやすいと思います。
追記
テキストの変更の際にイベントを発行するクラスがありました。addTextChangedListenerを追加するのですが、これはimplementsなどは必要はないのですが、イベント発生時の関数は用意しておく必要があります。
再度tChangeと言うprojectを作成して下記のようなスクリプトに変更をしたらテキスト変更毎にテキストの取得が可能となりました。
package in.andante.android.tchange; import android.app.Activity; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.widget.EditText; import android.widget.TextView; public class tChange extends Activity { /** Called when the activity is first created. */ private EditText _editText; private TextView _textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); _editText = (EditText)findViewById(R.id.editText1); _textView = (TextView)findViewById(R.id.textView1); _editText.addTextChangedListener(watchHandler); } private TextWatcher watchHandler = new TextWatcher() { @Override public void afterTextChanged(Editable s) { } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { _textView.setText(s); } }; }
addTextChangedListener部分に関しては下記のブログは参照させていただきました。
Androidアプリ入門 No.11 EditTextのActivityからの操作 – コンピュータクワガタ