#android #android-constraintlayout #appcompatdialogfragment
#Android #android-constraintlayout #appcompatdialogfragment
Вопрос:
Я пытаюсь создать AppCompatDialogFragment с корневым макетом в качестве ConstraintLayout.
Для корневого макета layout_width установлено значение wrap_content. Но когда я выполняю код, диалоговое окно сжимается и имеет фиксированную ширину, даже если содержимое изменяется.
Вот сгенерированный код макета
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<TextView
android:id="@ id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras tempus tristique ornare. Aenean ut magna in diam aliquet accumsan. "
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
Вот как я раздуваю макет:
View view = inflater.inflate(R.layout.weather_dialog, container, false);
Мы можем видеть, что при длинном тексте диалоговое окно достигает какой-то «максимальной ширины» (даже без атрибута).
Как я могу создать диалоговое окно, которое переносит его содержимое по ширине без этого «ограничения»?
Комментарии:
1. 1) Вы увеличиваете макет в
onCreateView()
? 2) Пожалуйста, поделитесь values/style.xml2. Привет, да, макет раздут
onCreateView()
. Также я протестировал свой фрагмент кода в пустом проекте, и поведение такое же … я не думаю, что это связано со стилями…3. Все в порядке, я только хотел узнать, сделали ли вы что-нибудь для оформления диалогового окна (фрагмента). Действительно интересный вопрос.
Ответ №1:
Существует пара Window
атрибутов стиля с именами android:windowMinWidthMajor
и android:windowMinWidthMinor
.
Минимальная разрешенная ширина окна вдоль главной [малой] оси экрана
(цитируется из документации)
Если вы используете Theme
для своего Dialog
, определяя некоторый стиль
<style name="FragmentDialogStyle" parent="Theme.AppCompat.Dialog">
<item name="windowMinWidthMajor">@dimen/dialog_fragment_width</item>
<item name="windowMinWidthMinor">@dimen/dialog_fragment_width</item>
<item name="android:windowMinWidthMajor">@dimen/dialog_fragment_width</item>
<item name="android:windowMinWidthMinor">@dimen/dialog_fragment_width</item>
</style>
и настройка
<item name="android:dialogTheme">@style/FragmentDialogStyle</item>
<item name="dialogTheme">@style/FragmentDialogStyle</item>
в приложении Theme
, тогда Dialog
ширина будет точно, dialog_fragment_width
если вы также используете
android:layout_width="0dp"
с вашим TextView
.
В то время как если вы продолжаете использовать
android:layout_width="wrap_content"
наблюдаемая вами «максимальная ширина» будет ограничивать вашу Dialog
ширину.
Кстати, если вы раскрасите фоны TextView
и ConstraintLayout
, вы заметите, что только при использовании значения 0dp
width все поля являются правильными.
Таким образом, кажется, что ваш лучший вариант — установить android:layout_width="0dp"
для TextView
и предоставить разные значения для dialog_fragment_width
, в зависимости от текущей ширины экрана (для Nougat : окно приложения). Для этого вам понадобятся разные каталоги, такие как res/values-w600dp
.
Пожалуйста, обратите внимание: я тестировал с эмуляторами для планшета под управлением Marshmallow и телефона под управлением Lollipop. Хотя это сработало, я был бы счастлив, если бы также мог объяснить, почему. Итак, я думаю, что это больше похоже на половину ответа, но я хотел поделиться своими наблюдениями.
Комментарии:
1. Да, это то, что я закончил делать. Вероятно, я ошибся, указав макет ограничения, у меня было такое же поведение с RelativeLayout.