2016-11-20 15 views
1

私はそのレイアウトがEditTextを保持するカスタムビューを持っています。私は、XMLレイアウトファイルでandroid:imeOptionsまたは他を追加し、それが子供にEditTextカスタムビューXMLファイルのattriburteを子に伝播

を伝播させるために、という希望 は(一貫性のため)W/Oカスタム属性、それを行うためにそこに方法は何ですか?

ありがとうございました。

答えて

1

これは、ViewGroupのコンストラクタに渡されたAttributesSetから直接属性値を取得することで可能です。 ViewGroupのメソッドaddView(View, int, LayoutParams)をオーバーライドすることで、その属性が見つかった場合、適切なタイプのViewが親に追加されたときにその属性を適用することができます。あなたが子供に伝播する属性がView sが、その後、あなたドンカスタムViewGroupのスーパークラスが既にハンドル1である場合

public class CustomViewGroup extends ViewGroup { 
    private static final String NAMESPACE = "http://schemas.android.com/apk/res/android"; 
    private static final String ATTR_IME_OPTIONS = "imeOptions"; 
    private static final int IME_OPTIONS_NONE = -1; 

    private int mImeOptions; 

    // Additional constructors as needed 

    public CustomViewGroup(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     mImeOptions = attrs.getAttributeIntValue(NAMESPACE, ATTR_IME_OPTIONS, IME_OPTIONS_NONE); 
    } 

    @Override 
    public void addView(View child, int index, ViewGroup.LayoutParams params) { 
     super.addView(child, index, params); 

     if (mImeOptions != IME_OPTIONS_NONE && child instanceof EditText) { 
      ((EditText) child).setImeOptions(mImeOptions); 
     } 
    } 

    ... 
} 

imeOptions属性を使用して、例えば

、必ずAttributeSetからそれを読む必要があります。その代わりに適切なgetterメソッドを使用して、スーパーコンストラクタへの呼び出しの後にその値を取得することができます。スーパーコンストラクタは、既に処理されて適用されます。

+0

ありがとうございました。 どの 'namespace'とどのメソッドを取得するのですか? – SnapDragon

+1

'getAttribute * Value()'メソッドは、属性の型によって異なります。たとえば、 'enabled'属性の場合は' getAttributeBooleanValue() 'を使います。特定のメソッドは、 'getAttributeValue()'、btw - で得られる値の 'String'表現を与えられた型に変換しようとします。名前空間に関しては、XMLで 'android:'という接頭辞が付いたプラットフォーム定義の属性であれば、常に上の例に示すようになります。デフォルトでは、あなたのレイアウトのルート 'View'sに' xmlns:android'として常に設定されていることがわかります。 –

+0

XMLで必要なカスタム名前空間を定義して、カスタム属性に使用することもできます。これは基本的に 'View'のカスタム属性を作成するときや、ライブラリから' View'を使うときに行うことです。これらの接頭辞としてXMLに追加の 'xmlns:app'が表示されます。しかし、対応する ''要素を作成しなければ、属性を取得するために 'R.styleable'が使用されないので、上記のようにする必要があります。 –