Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

Некорректно отображается TextView без вызова setLayoutParams

#android #android_textview


Я создаю TextView в Java-коде и присваиваю ему стиль следующим образом:

TextView mTextView = new TextView(new ContextThemeWrapper(mContext, R.style.myStyle),
null, 0);


Вот XML-код стиля:




Но TextView в компоновке отображается некорректно. Я попробовал добавить эту команду
в Java-код:

mTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT, 1));


и только тогда элемент стал правильно отображаться. В чём заключается такая потребность
вызывать этот метод setLayoutParams, если я уже указал значение параметров android:layout_height,
android:layout_weight и android:layout_width в стиле? То есть, мой вопрос заключается
в том, почему без вызова в Java-коде метода setLayoutParams элементу не присваиваются
значения android:layout_height, android:layout_weight и android:layout_width из стиля
и как это исправить?
    


Ответы

Ответ 1



Так не очень хорошо делать при динамическом создании View изначально, старайтесь при динамической верстки все параметр использовать в коде, а стили выносить в отдельные классы, те создавать ваш StyleWrapper, иначе в вашем коде нет смысла не по производительности, не по структуре. Вы будуте дольше искать ошибки верстки постояно изучая несколько участков в коде. Хотя на практике есть примеры полностью динамической верстки больших приложений (telegram), и даже есть либы для упрощения. Не суть. Что касается ответа. Он прост. Никак setLayoutParams в вашем случае, не влияют на отображения вью если вы добавляете ваше View parent которого является LinearLayout. Вы прочитайте что такое ContextWrapper и для чего он необходим, уж точно не для того чтобы для всех View выставлять параметры, weight или gravity которые в большинстве случае не будут применены. у TextView применения стиля делается примерно так: TextViewCompat.setTextAppearance(textView, R.style.myStyle) для того чтобы вью добавить в любой parent необходимо сделать примерно так: TextView textView = new TextView(this); //создать textView.setText("всё хорошо"); //присвоить значение LinearLayout mainLayout = findViewById(R.id.mainLayout); mainLayout.addView(textView); // добавить View Если вы хотите данный View расположить определным образом у парента только тогда применяюстя LayoutParams, в зависимости какой парент у вас, это очень важно! textView.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT, 1)); //только сейчас вы выставляете вес = 1 mainLayout.addView(textView) // добавить View Исходя из этого вывод, вы не верно использовали стиль и когда создавали View не использовался weight 1, и ваша View скорей всего исчезала, после того как вы выставили ей вес через LayoutParams она начала отображаться. Аналоигчно и другим параметрам. Но чтоб такого не происходило, советую прочитать заголовок ответа. Успехов.

Комментариев нет:

Отправить комментарий