Составьте кнопку для использования в различных частях моего проекта
У меня есть кнопка, и мне нужно использовать одну и ту же кнопку с одинаковыми свойствами во всех моих проектах, и я хочу создать компонент, чтобы просто вызывать этот компонент, и если мне нужно изменить свою кнопку, измените только один класс, измените все использует.
У меня есть эта кнопка:
<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>