2011-09-22 8 views
10

EditTextに機能を追加して、レイアウトxmlに新しく拡張したフィールドを含めると、 Activityクラスにコードを追加して、特定の方法で動作させるようにします。EditTextを拡張して「デフォルト」機能を追加する正しい方法

たとえば、EditPhoneフィールドは、キーイベントをリッスンし、括弧と適切な場所にダッシュを含むようにフィールドを変更する追加機能を持つEditTextです。

現在のところ、私はいつもリスナーコードを含めてビューに手動で添付する必要があります。しかし明らかに、クラスには、それにラップされた大量のデフォルト動作があります(たとえば、クリックするとキーボードが表示されます)。だから、私はそれが厳しいものではないはずだと思っていますが、これを達成するための措置が何であるかについては明確ではありません。

また、上記のPhone固有の機能(私はすべて機能しています)には助けが必要ではありません。私は、Viewを拡張する方法を理解するために、追加の機能デフォルトでは、同じコードを何度も繰り返す必要がありません。

答えて

24

実際、それについては何も複雑ではありません。通常、コード内でEditTextInputFilterを適用すると、これがうまくいくでしょう。

public class PhoneEditText extends EditText { 

    public PhoneEditText(Context context) { 
     super(context); 
     init(); 
    } 

    public PhoneEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public PhoneEditText(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    private void init() { 
      // set your input filter here 
    } 
} 

XMLレイアウトではあなたは、単にあなたのカスタムクラスの代わりのEditTextへのフルパスを使用します。あなたはそれでパターンを見ると、いつもあなたが作成することができ、そのように振る舞うのEditTextをしたい場合でも、カスタムそのようにウィジェット:

<my.package.path.to.PhoneEditText 
    attribute="value (all EditText attributes will work as they did before)" /> 
+1

私はinitメソッドにonkeyリスナーを追加しますか? –

+0

必要な場合:はい。しかし、テキスト入力の制限は入力フィルタによって適用されます。しかし、あなたは 'init'で必要なものを設定し、変更することができます。 – Knickedi

+0

はい、私は入力フィルタを調べて、それが私の問題に当てはまるかどうかを確認する必要がありますが、あなたがやっていることを見ていて、あなたが正しいと思う...かなり簡単です:) –