Рубрики
Без рубрики

Пользовательские представления: выделите свое приложение для Android

Пользовательские представления всегда воспринимаются как хвостатый зверь, особенно когда вы проверяете сайт разработчика о том, как вы можете создавать свои виджеты пользовательских представлений, вы видите много вещей, которые на самом деле не соответствуют вашим…

Автор оригинала: Joshua Aroke.

Пользовательские представления всегда выглядят как хвостатый зверь, особенно когда вы проверяете сайт разработчика о том, как вы можете создавать свои виджеты пользовательских представлений, вы видите много вещей, которые на самом деле не делают того, что вы ищете. Большинство руководств на сайте разработчика по созданию пользовательских представлений основаны на том, что вы рисуете свой собственный макет, который может быть довольно запутанным и сложным, особенно когда вы думаете о том, как получить ссылку на объекты, которые вы рисуете. Вот более простой способ быстро просмотреть пользовательский вид и при этом удовлетворить ваши потребности в пользовательском интерфейсе.

Одна вещь, которую вам нужно знать о создании пользовательского представления, – это то, что фрейм-это ваш друг. Эта группа просмотра обычно не используется многими разработчиками, тем более, что ее трудно понять, ее роль в представлении наследника achy хорошо для одного фрейма.Это один из наиболее удобных видов для расширения и начала взлома вашего пользовательского виджета.

ШАГ 1:

Создайте новый файл java, давайте назовем его “Custom.java”, расширьте отображение фрейма и переопределите необходимые конструкторы.

public class RevealView extends FrameLayout{ protected boolean toggle; protected Drawable lessArrow = getResources().getDrawable(R.drawable.ic_expand_less); protected Drawable moreArrow = getResources().getDrawable(R.drawable.ic_expand_more_white); private FontTextView topBarText, bottomBarText; protected View topBar; protected ViewGroup bottomBar; protected ImageView toggleBottom;
public RevealView(@NonNull Context context) { super(context); } public RevealView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public RevealView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); }}

ШАГ 2:

Давайте создадим наш файл xml-макета, именно здесь будет происходить все строительство. Поэтому для этого урока мы создадим аккордеон, который показывает дополнительный контент на ощупь. Поэтому перейдите в папку res и создайте свой custom.xml файл макета. Теперь, прежде чем добавить xml-код, вам необходимо загрузить и добавить два значка в папку для рисования, 1. стрелка обращена вверх и 2. другой лицом вниз . Вы можете получить их из пакета значков Google material design

       

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

ШАГ 3:

Итак, вот где начинается самое интересное, вы знаете все те свойства, которые вы задаете для представлений в своем xml-файле? Ну, мы собираемся определить некоторые из них для нашего пользовательского представления. Для этого перейдите в каталог res , а затем найдите папку с именем значения там должен быть файл с именем attrs.xml там, если он недоступен, создайте его, другими словами, полный путь, который вы ищете, должен быть res/values/attrs.xml


     

Ваш файл должен выглядеть так, как показано выше. Итак, давайте вкратце рассмотрим свойства:

  1. цветовая панель: Определяет цвет заголовка
  2. панель содержимого: Определяет цвет тела/содержимого(часть представления, которая будет видна или скрыта при взаимодействии с пользователем.
  3. название бара: Текст заголовка, который появится в заголовке представления.
  4. сообщение: Основной текст вида снизу
  5. ShowMessage: значение, определяющее, должно ли представление отображать контейнер тела или нет.

ШАГ 4:

Давайте отправимся в наш Custom.java и инициализируйте некоторые переменные, которые мы будем использовать при построении нашего представления.

public class RevealView extends FrameLayout{
//init properties protected boolean toggle; protected Drawable lessArrow = getResources().getDrawable(R.drawable.ic_expand_less); protected Drawable moreArrow = getResources().getDrawable(R.drawable.ic_expand_more_white); private TextView topBarText, bottomBarText; protected View topBar; protected ViewGroup bottomBar; protected ImageView toggleBottom;
public RevealView(@NonNull Context context) { super(context); } public RevealView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public RevealView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); }}

Теперь давайте создадим наши вспомогательные методы, которые будут управлять представлением. Добавьте эти методы в нижнюю часть файла.

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

public void setTitle(String title){ topBarText.setText(title);}public void setMessage(String message){ bottomBarText.setText(message);}public void setTitleBarColor(int color){ topBar.setBackgroundColor(getResources().getColor(color));}public void setBottomBarColor(int color){ bottomBar.setBackgroundColor(getResources().getColor(color));}

Давайте создадим наш OnClickListener, чтобы каждый раз, когда кто-то касается верхней панели, нижняя часть представления либо открывалась, либо скрывалась. Вы можете добавить это в нижнюю часть файла.

Помните, что мы добавили представление видимость:пропал куда? этот прослушиватель позаботится о том, чтобы включить или скрыть его.

protected OnClickListener setToggle(final ImageView toggleButton, final View bottomBar){ return new OnClickListener() { @Override public void onClick(View v) { Drawable drawable = lessArrow; int visibility = View.VISIBLE; if(toggle){ drawable = moreArrow; visibility = View.GONE; toggle = false; }else { toggle = true; } toggleButton.setImageDrawable(drawable); bottomBar.setVisibility(visibility); } };}

Хорошо, теперь давайте объединим их все вместе в метод инициализации, который представление будет вызывать каждый раз, когда над ним выполняется действие.

public void init(Context context, AttributeSet attributeSet){ inflate(context, R.layout.reveal_view, this); topBar = findViewById(R.id.topBar); bottomBar = (ViewGroup) findViewById(R.id.bottomBar); toggleBottom = (ImageView) findViewById(R.id.toggle_button); topBarText = (TextView) findViewById(R.id.top_bar_title); bottomBarText = (TextView) findViewById(R.id.bottom_bar_text); topBar.setOnClickListener(setToggle(toggleBottom, bottomBarText)); if(attributeSet != null){ TypedArray typedArray = context.obtainStyledAttributes(attributeSet, R.styleable.RevealView); try { toggle = typedArray.getBoolean(R.styleable.RevealView_showMessage, false); bottomBar.setVisibility(toggle ? View.VISIBLE : View.GONE); toggleBottom.setImageDrawable(toggle ? lessArrow : moreArrow); if(typedArray.hasValue(R.styleable.RevealView_barTitle)){ topBarText.setText(typedArray.getString(R.styleable.RevealView_barTitle)); } if(typedArray.hasValue(R.styleable.RevealView_colorBar)){ topBar.setBackgroundColor(typedArray.getColor(R.styleable.RevealView_colorBar, getResources().getColor(R.color.top_bar_color))); } if(typedArray.hasValue(R.styleable.RevealView_contentBar)){ bottomBar.setBackgroundColor(typedArray.getColor(R.styleable.RevealView_contentBar, getResources().getColor(R.color.bottom_bar_color))); } if(typedArray.hasValue(R.styleable.RevealView_message)){ bottomBarText.setText(typedArray.getString(R.styleable.RevealView_message)); } } finally { typedArray.recycle(); } }}

Теперь нам нужно вызвать init() в наших конструкторах, определенных ранее. Обратите внимание, что всякий раз, когда представление обновляется, вызываются конструкторы, следовательно, будет вызван наш метод, и мы сможем выполнять действия с нашим представлением.

public RevealView(@NonNull Context context) { super(context); init(context, null);}public RevealView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(context, attrs);}public RevealView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs);}

Теперь вы можете видеть, как мы ссылаемся на attrs.xml файл, который мы создали ранее, чтобы узнать, какое значение установлено, и изменить наше представление на основе этого. Итак, давайте добавим наше представление в файл макета и посмотрим, хорошо ли мы справились. Итак, давайте создадим reveal_tester.xml Чтобы добавить свое представление, просто назовите имя класса пользовательского представления, и автозаполнение Android studio поможет вам с полным именем пакета.

 

Теперь, если вы заметили, что пространство имен добавляется автоматически для использования применить: мы используем это для доступа к нашим пользовательским свойствам и устанавливаем свойству showmessagebox значение true, чтобы тело можно было отображать по умолчанию.

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

setContentView(R.layout.reveal_tester);

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

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

Оригинал: “https://www.codementor.io/@codebitdev/custom-views-make-your-android-app-stand-out-d5ecsgkim”