Use declare styleable to set custom component input type

Lets say you have a custom view named InputView, which is not a TextView (lets say its a RelativeLayout).

In your attrs.xml:

<declare-styleable name="InputView">

    <!-- any custom attributes -->
    <attr name="title" format="string" /> 

    <!-- standart attributes, note android: prefix and no format attribute -->
    <attr name="android:imeOptions"/> 
    <attr name="android:inputType"/>

</declare-styleable>

In an xml layout where you want to include InputView:

<!-- note xmlns:custom and com.mycompany.myapp -->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

        <!-- note that you will be using android: prefix for standart attributes, and not custom: prefix -->
        <!-- also note that you can use standart values: actionNext or textEmailAddress -->
        <com.mycompany.myapp.InputView
        android:id="@+id/emailField"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        custom:title="@string/my_title"
        android:imeOptions="actionNext|flagNoExtractUi"
        android:inputType="textEmailAddress" />

</FrameLayout>

Inside your custom class you can extract attributes as usual:

    ...

    private String title;
    private int inputType;
    private int imeOptions;

    ...
    TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.InputView);

    int n = a.getIndexCount();
    for (int i = 0; i < n; i++) {
        int attr = a.getIndex(i);
        switch (attr) {
        case R.styleable.InputView_title:
            title = a.getString(attr);
            break;
        //note that you are accessing standart attributes using your attrs identifier
        case R.styleable.InputView_android_inputType:
            inputType = a.getInt(attr, EditorInfo.TYPE_TEXT_VARIATION_NORMAL);
            break;
        case R.styleable.InputView_android_imeOptions:
            imeOptions = a.getInt(attr, 0);
            break;
        default:
            Log.d("TAG", "Unknown attribute for " + getClass().toString() + ": " + attr);
            break;
        }
    }

    a.recycle();
    ...

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)