AppCompatDialogFragment с шириной диалогового окна ConstraintLayout

#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.xml

2. Привет, да, макет раздут 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.