Я создал пользовательский интерфейс в Android Studio, который наследуется от LinearLayout. По сути, это текст редактирования с синим полукруглым прямоугольником, в который можно поместить текст.
Я добавил свойство enum с именем borderSide
, которое имеет значения справа и слева. По умолчанию граница находится справа. То, что я пытаюсь сделать, это иметь условие, что, когда borderSide оставлен, выбран другой макет, чтобы синий прямоугольник с полукруглыми углами был слева. Обыскав вокруг, я не вижу простого способа сделать это.
В настоящее время у меня есть это (извинения, если это немного испортилось, это на другой машине)
В Drawable у меня есть два файла; supplemental_edittext
и supplemental_edittext_left
. Это селекторы для различных состояний нажатия, включения и фокусировки, а также выбор рисования. Слева означает, что он выбирает набор для рисования для левой стороны текста редактирования. Drawable устанавливает границу и прямоугольник.
Базовый класс (ValidLayout) для макета наследует LinearLayout и имеет несколько свойств для текста ошибки. Он также раздувает простой макет, который содержит два текстовых представления для заголовка и текста ошибки. Он имеет виджет edittext, в который добавляется @override public void addView
- это выглядит так
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params)
{
if (child instanced EditText)
{
if (editText != null)
throw new RuntimeException("You can only add 1 child");
editText = (EditText) child;
super.addView(child, 1, params);
}
else
{
super.addView(child, index, params);
}
}
Класс, который я установил для свойства borderSide
в (SupplementEditText), выходит из базового класса и имеет метод с именем setBorderSide(int side)
. Существует тест для edittext (созданный выше), который сначала проверяет, является ли он нулевым, и если он не устанавливает фон. Код для изменения выглядит следующим образом
public void setBorderSide(int side)
{
if (edittext == null)
return;
borderSide = side == 0 ? false : true;
editText.setBackgroundResource(borderSide ? R.drawable.supplemental_edittext : R.drawable.supplemental_edittext_left);
}
Первоначальный вызов setBorderSide
выполняется методом Initialise
.
Вместе в XML они работают так
<ValidLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/vlEditText"
app:borderSide="left">
<SupplementEditText
android:layout_width="match_content"
android:layout_height="wrap_content"
android:id="@+id/sEditText"
app:supplementTextPosn="end"
app:supplementText="Hi" />
SupplementTextPosn и SuppmentText - это два свойства в SupplementText, которые устанавливают текст и положение текста слева или справа от EditText внутри прямоугольника с полукруглыми углами, созданного в базовом классе
Кажется, есть две проблемы. Во-первых (и это, вероятно, большое значение), edittext является нулевым. Если я уберу проверку, граница останется всегда слева независимо от того, что я установил для borderSide.
В AndroidStudio есть способ проверить, что происходит, почему он плохо себя ведет и более, способ поменять с supplemental_edittext
на supplemental_edittext_left