Составьте кнопку для использования в различных частях моего проекта

У меня есть кнопка, и мне нужно использовать одну и ту же кнопку с одинаковыми свойствами во всех моих проектах, и я хочу создать компонент, чтобы просто вызывать этот компонент, и если мне нужно изменить свою кнопку, измените только один класс, измените все использует.

У меня есть эта кнопка:

<br.com.simplepass.loading_button_lib.customViews.CircularProgressButton
            android:id="@+id/createMatch"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:background="@color/buttonColor"
            android:layout_marginTop="16dp"
            app:spinning_bar_width="4dp"
            app:spinning_bar_color="#FFF"
            android:alpha="0.5"
            android:textColor="@color/colorAccent"
            android:elevation="4dp"
            android:enabled="false"
            android:layout_marginLeft="16dp"
            android:textStyle="bold"
            android:text="@string/createMatch"
            android:textSize="14sp"
            app:spinning_bar_padding="6dp"/>

Я создаю класс, расширяющий CircularProgressButton, но некоторые свойства у меня нет идей, как получить доступ в коде. Свойства с приложением: например.

Объединяя два вопроса, как мне сделать компонент с разметкой с различными элементами?

например:

<LinearLayout>
   <Toolbar/>
   <LinearLayout/>
</LinearLayout>

Я хочу создать этот xml в классе для вызова и получить все это во всех макетах, используя мой пользовательский класс.

<MyLinearLayout>
...
</MyLinearLayout>

2 ответа

Решение

некоторые свойства у меня нет идей, как получить доступ в коде. Свойства с приложением: например.

Посмотрите здесь. Вам нужно будет создать подкласс View и предоставить конструктор, который принимает Context и AttributeSet.

class CircleView extends View {

    private String mTitleText = "Your default title";

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

        // You can and should also pass a style as third argument
        final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CircleView, 0, 0);

        if (a.hasValue(R.styleable.CircleView_titleText)) {
            mTitleText = a.getString(R.styleable.CircleView_titleText);
        }

        a.recycle();
    }
}

Вы могли заметить использование R.styleable.CircleView_titleText в моем примере. Перед использованием пользовательских атрибутов вы должны сообщить о них компилятору. Это достигается путем добавления .xml определение ваших атрибутов и их ожидаемого формата.

<resources>
    <declare-styleable name="CircleView">
        <attr name="titleText" format="string" />
    </declare-styleable>
</resources>

Как сделать компонент с разметкой с различными элементами?

Многоразовые макеты, вероятно, то, что вы ищете.

Примером этого может быть определение пользовательской панели инструментов как toolbar.xml,

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#e40056"
    android:elevation="4dp"
    android:minHeight="?attr/actionBarSize"
    app:titleTextColor="#ffffff"
    />

а потом include это в других взглядах:

<include
    android:id="@+id/myToolbarId"
    layout="@layout/toolbar"
    />

Если вы посмотрите на исходный код ProgressBar, вы увидите, что вы можете использовать TypedArray извлечь стилизованные атрибуты из XML AttributeSet,

public ProgressBar(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    ...
    final TypedArray a = context.obtainStyledAttributes(
            attrs, R.styleable.ProgressBar, defStyleAttr, defStyleRes);
    ...
    // this is where we get the drawable that is specified in the XML
    final Drawable progressDrawable = a.getDrawable(R.styleable.ProgressBar_progressDrawable);
    ...
}

Вы можете сделать то же самое, чтобы получить app атрибуты, которые вы ищете, но некоторые атрибуты помечены как внутренние. В этих случаях я хотел бы рассмотреть их в res/values/attrs.xml потому что они могут измениться.

Примечание: progressDrawable не обязательно является внутренним, я просто использовал его в качестве примера

<resources>
    <declare-styleable name="ProgressBar">
        <attr name="progressDrawable"/>
    </declare-styleable>
</resources>

Что касается вашего второго вопроса, я не уверен, что вы хотите продлить LinearLayout (против чего я бы посоветовал из-за того, что вам пришлось бы писать код для создания представлений) или просто повторно использовать LinearLayout с видом внутри.

Если это последнее, то вы можете просто сделать XML-файл только с вашим LinearLayout внутри этого с соответствующими детьми, давайте назовем это myLayout.xml, Затем, в других ваших XML-файлах, вы можете просто поместить его так:

myLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
   <Toolbar/>
   <LinearLayout/>
</LinearLayout>

activity_main.xml

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/lorem_ipsum"/>

    <include layout="@layout/myLayout"/>

</LinearLayout>
Другие вопросы по тегам