Как создать простой пользовательский вид?
-
09-10-2019 - |
Вопрос
Я хотел бы создать пользовательский View
на Android. Я пытался сделать это как можно проще и создал почти пустой класс MyView
и использовал его в моем LinearLayout
Но приложение не удается с начала с «Force Close». Как я могу сделать простой обычай View
? В соответствии с Создание пользовательских компонентов а View
Получает размер 100x100, если я не переопределяю onMeasure()
.
public class MyView extends View {
public MyView(Context context) {
super(context);
}
}
И я использую его в LinearLayout
с:
<view
class="com.example.MyView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0" />
Что я делаю не так?
Если я использую конструктор, который itemon Предложите и соответствующий звонок в Superclass. Тогда «Сила закрытия» исчезла, но мой LinearLayout
сломан, компоненты после MyView
не показан.
Вот мой main.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0"
android:background="#f00"
android:text="Hello"
/>
<view
class="com.example.MyView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.0"
android:background="#00f"
android:text="World"
/>
</LinearLayout>
Решение
Может быть, вы можете определить другой метод конструктора, подобный этому:
public MyView(Context context, AttributeSet attrs)
Android Framework попытается создать пользовательский интерфейс с вашим представлением из конструктора выше.
Другие советы
Руководство по разработчику Android имеет раздел под названием «Строительные компоненты». К сожалению, обсуждение только атрибутов XML охватывает только объявление элемента управления внутри файла макета и не обрабатывает значений внутри инициализации класса. Шаги следующие:
Объявить атрибуты в значениях attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MyCustomView">
<attr name="android:text"/>
<attr name="android:textColor"/>
<attr name="extraInformation" format="string" />
</declare-styleable>
</resources>
Обратите внимание на использование неквалифицированного имени в теге Declare-Stylable. Нестандартные атрибуты Android, такие как ресурс, должны объявить свой тип. Теги, объявленные в SuperClass, будут доступны на подклассах без необходимости переработать.
Создать конструкторы
Поскольку существует два конструктора, которые используют атрибутусет для инициализации, удобно создать отдельный метод инициализации для вызова конструкторов.
private void init(AttributeSet attrs){
TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView);
//Use a
Log.i("test",a.getString(R.styleable.MyCustomView_android_text));
Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK));
Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation));
//Don't forget this
a.recycle();
}
R.stylable.mycustomview - это автогентерированный ресурс Int [], где каждый элемент является идентификатором атрибута. Атрибуты генерируются для каждого свойства в XML, добавив имя атрибута к имени элемента. Затем атрибуты могут быть извлечены из TypedArray, используя различные функции GET. Если атрибут не определен в XML, то NULL возвращается. За исключением, конечно, если тип возврата является примитивом, и в этом случае второй аргумент возвращается.
Если вы не хотите получать все атрибуты, можно создать этот массив вручную. Идентификатор для стандартных атрибутов Android включен в Android.r.attr, в то время как атрибуты для этого проекта находятся в R.ATTR.
int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};
Обратите внимание, что вы не должны использовать ничего в Android.R.Stilable, в соответствии с этой темой это может измениться в будущем. Это все еще в документации, так как просмотр всех этих констант в одном месте полезно.
Используйте его в файлах макета, таких как Mayout main.xml, включите объявление пространства имен
xmlns: app = "http://schemas.android.com/apk/res/com.mycompany.projectname"
В верхнем уровне XML -элемент.
<com.mycompany.projectname.MyCustomView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:text="Test text"
android:textColor="#FFFFFF"
app:extraInformation="My extra information";
/>
Ссылка на пользовательский просмотр, используя полностью квалифицированное имя.
Android Labelview Пример
Если вам нужен полный пример, посмотрите на пример просмотра метки Android.
Labelview.java
TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
CharSequences=a.getString(R.styleable.LabelView_text);
attrs.xml
<declare-styleable name="LabelView">
<attr name="text"format="string"/>
<attr name="textColor"format="color"/>
<attr name="textSize"format="dimension"/>
</declare-styleable>
custom_view_1.xml
<com.example.android.apis.view.LabelView
android:background="@drawable/blue"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
app:text="Blue"app:textSize="20dp"/>
Это содержится в линейном виде с атрибутом пространства имен:
xmlns: app = "http://schemas.android.com/apk/res/com.example.android.apis"