Widget解説第二回 "EditText"

そんなわけで第二回。
前回い忘れてたけど基本的にレイアウトファイルは使わない方向でいきます。
対応するアトリビュートは例えばEditTextなら、
http://code.google.com/android/reference/android/widget/TextView.html
の最初の方にある"XML Attributes"を参考にしてください。


前回と同様まず次の映像と下部のソースを見てもらうとわかりやすいと思う。
http://screencast.com/t/57sNQ0spKTR


次に補足の解説をする。


テキストの範囲を選択するには今回使ったextendSelectionメソッドの他に、
setSelection(int start, int stop)メソッドがある。
extendSelectionメソッドがカーソルの現在の位置から指定した位置まで選択するのに対し、
setSelection(int start, int stop)メソッドは引数で指定した範囲を選択すr。
また単にカーソルを移動したいだけならsetSelection(int index)メソッドを使う。


今回例には出していないがテキストの行数を変更するにはsetLinesメソッドを使う。


EditTextで面白いのはsetTransformationMethodメソッドと、setInputMethodメソッドである。


setTransformationMethodは引数にandroid.text.method.TransformationMethodをとる。
これは簡単に言えば与えられた入力に処理を施して出力するというものだ。
例えば今回使ったPasswordTransformationMethodは与えられた入力を全部"●"に置き換えて出力している。
他にはSingleLineTransformationMethodがある。
これはエンターキーの入力を他の文字で置き換えることで複数行の入力を防ぐものである。


次にsetInputMethodメソッドである。これは引数にandroid.text.method.InputMethodをとる。
これは何をするものかというとユーザの入力を規制するものである。
例えば引数にDigitsInputMethodを用いるとユーザは数字の入力しかできなくなる。
さらにTextInputMethodを用いると今回の例のように入力を全て大文字にしたりできる。
ソース中のCHARACTERSの部分は他にNONEやWORDS、SENTENCESを指定できる。


TransformationMethodとかInputMethodをを自分で作れると面白そう。

ソース

package net.swelt.android.widgetedittext;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.graphics.Color;
import android.text.method.*;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.LinearLayout;

import java.util.Random;

public class WidgetEditText extends Activity {
	private final int WRAP_CONTENT = ViewGroup.LayoutParams.WRAP_CONTENT; 
	private final int FILL_PARENT = ViewGroup.LayoutParams.FILL_PARENT;
	
	private LinearLayout mLinearLayout;
    
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        
        mLinearLayout = new LinearLayout(this);
        setContentView(mLinearLayout);
        mLinearLayout.setOrientation(LinearLayout.VERTICAL);

        EditText et1 = makeEditText(this, 200, WRAP_CONTENT);
        et1.setText("EditText1");
        et1.setNormalTextColor(Color.RED);
        et1.setFocusedTextColor(Color.BLUE);
        
        EditText et2 = makeEditText(this, 200, WRAP_CONTENT);
        et2.setText("EditText2");
        et2.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View v) {
        		Random rand = new Random();
        		((EditText) v).setHiliteColor(rand.nextInt());
        	}
        });
        
        EditText et3 = makeEditText(this, 200, WRAP_CONTENT);
        et3.setText("EditText3");
        et3.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View v) {
        		showAlert("Title", ((EditText) v).getText(), "OK", true);
        	}
        });
        et3.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        	public void onFocusChanged(View v, boolean hasFocus) {
        		showAlert("Title", hasFocus ? "Hello!" : "Bye...", "OK", true);
        	}
        });
        
        EditText et4 = makeEditText(this, 200, WRAP_CONTENT);
        et4.setText("EditText4");
        et4.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View v) {
        		EditText et = (EditText) v;
        		et.extendSelection(et.getText().length());        		
        	}
        });
        
        EditText et5 = makeEditText(this, 200, WRAP_CONTENT);
        et5.setText("EditText5");
        et5.setSingleLine();
        //et5.setLines(1);

        EditText et6 = makeEditText(this, 200, WRAP_CONTENT);
        et6.setText("EditText6");
        et6.setTransformationMethod(PasswordTransformationMethod.getInstance());
        et6.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View v) {        		
        		showAlert("Title", "Your password is \""+((EditText) v).getText()+"\"", "OK", true);
        	}
        });
        
        EditText et7 = makeEditText(this, 200, WRAP_CONTENT);
        et7.setText("EditText7");
        et7.setInputMethod(TextInputMethod.getInstance(true, TextInputMethod.Capitalize.CHARACTERS));
    }
    
    private EditText makeEditText(Context context, int w, int h) {
    	EditText et = new EditText(context);
    	et.setLayoutParams(new LinearLayout.LayoutParams(w, h));
    	mLinearLayout.addView(et);
    	return et;
    }
}