Изменение макета в зависимости от свойства в Android - PullRequest
0 голосов
/ 30 марта 2019

Я создал пользовательский интерфейс в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...