Как получить атрибуты Android по умолчанию в настраиваемом представлении

Я создал простое настраиваемое представление, содержащее RelativeLayout и EditText:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:id="@+id/edt_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</RelativeLayout>

Также я добавил несколько настраиваемых атрибутов в res/values/attrs.xml, и я извлекаю эти атрибуты в свой настраиваемый конструктор представления, и все работает нормально.

Теперь я хочу получить EditText атрибутов по умолчанию в моем настраиваемом представлении, например, я хочу получить атрибут android:text в моем настраиваемом представлении.

Мой собственный класс представления (упрощенный):

public class CustomEditText extends RelativeLayout {
    private int panCount;

    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,
            R.styleable.CustomEditText, 0, 0);
        try {
            this.panCount = typedArray.getInt(R.styleable.CustomEditText_panCount, 16);
        } finally {
            typedArray.recycle();
        }
    }
}

Как я могу сделать это без повторного объявления текстового атрибута в res/values/attrs.xml?


person hosseinAmini    schedule 16.06.2017    source источник
comment
сбивает с толку, что вы не используете свое представление в xml-коде ...! Вы уверены, что разместили последний код? Проверьте этот ответ: stackoverflow.com/a/8090772/7134908 может решить вашу проблему, установив значение в xml и войдя в Java vode   -  person Ajeet Choudhary    schedule 16.06.2017
comment
Не могли бы вы добавить свой styleable файл для CustomEditText?   -  person tynn    schedule 16.06.2017
comment
Возможный дубликат Как получить атрибуты с пространством имен android в настраиваемом TextView   -  person Mir-Ismaili    schedule 21.11.2017


Ответы (4)


Вы можете добавить android:text к объявленному слогу. Но убедитесь, что не объявляли повторно.

<declare-styleable name="CustomEditText">
    <attr name="android:text" />
</declare-styleable>

Затем получите это значение из стиля, как если бы вы использовали любой другой из ваших атрибутов с индексом R.styleable.CustomEditText_android_text.

CharSequence text = typedArray.getText(R.styleable.CustomEditText_android_text);
person tynn    schedule 16.06.2017
comment
похоже, не работает со смешанным регистром, например android: textColor? - person coyer; 23.07.2019
comment
Это не должно иметь значения. У меня никогда не было проблем с этим. - person tynn; 23.07.2019

Я думаю, ты не сможешь этого сделать. Добавьте идентификатор в свой edittext в xml, и если вы хотите получить значение editText, просто используйте:

edittext.getText().toString()
person Dany Pop    schedule 16.06.2017
comment
Я хочу использовать android: text = some text в xml и получить его в моем настраиваемом классе представления, например настраиваемых атрибутах - person hosseinAmini; 16.06.2017
comment
Пожалуйста, опубликуйте свой собственный класс просмотра - person Dany Pop; 16.06.2017
comment
Я добавил свой собственный класс просмотра - person hosseinAmini; 16.06.2017

Я думаю, это невозможно, потому что ваш customview расширяет relativeLayout и не имеет этого атрибута. Вы можете получить доступ к android: text или другим атрибутам, если вы напрямую расширяете EditText или TextView.

person Arefeh Iravanchi    schedule 16.06.2017

Вы можете построить это, используя макет, например

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">

<EditText
    android:id="@+id/edittext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:text="My Custom View" />
</RelativeLayout>

Ваш класс customview будет таким

public class CustomEditText extends RelativeLayout {
    LayoutInflater mInflater;

    public CustomView(Context context) {
        super(context);
        mInflater = LayoutInflater.from(context);
        init();

    }

    public CustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mInflater = LayoutInflater.from(context);
        init();
    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mInflater = LayoutInflater.from(context);
        init();
    }

    // Here you can access your edittext text
    public void init() {
        View v = mInflater.inflate(R.layout.custom_view, this, true);
        EditText et = (TextView) v.findViewById(R.id.edittext);
        et.setText(" Custom RelativeLayout");
    }
}
person Krutik    schedule 16.06.2017