【问题标题】:AppCompatDialogFragment with ConstraintLayout dialog width具有 ConstraintLayout 对话框宽度的 AppCompatDialogFragment
【发布时间】:2016-10-20 10:02:58
【问题描述】:

我正在尝试将具有根布局的 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) 你是否在onCreateView() 中膨胀了布局? 2) 请分享 values/style.xml
  • 嗨,是的,布局在onCreateView() 中被夸大了。另外我在一个空白项目上测试了我的代码sn-p,行为是一样的......我认为它与样式无关......
  • 没关系,我只想知道您是否对对话框(片段)进行了任何设置。非常有趣的问题。

标签: android android-constraintlayout appcompatdialogfragment


【解决方案1】:

有一对Window 样式属性命名为android:windowMinWidthMajorandroid:windowMinWidthMinor

窗口允许的最小宽度,沿屏幕的主要[次要]轴

(引自documentation

如果您通过定义一些样式来为您的Dialog 使用Theme

<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 宽度。

顺便说一句,如果您为TextViewConstraintLayout 的背景着色,您会发现只有在使用0dp 宽度值时所有边距都是正确的。

因此,您最好的选择似乎是为TextView 设置android:layout_width="0dp",并为dialog_fragment_width 提供不同的值,具体取决于当前屏幕(对于 Nougat+:应用程序窗口)宽度。为此,您需要不同的目录,例如 res/values-w600dp

请注意:我使用模拟器测试了运行 Marshmallow 的平板电脑和运行 Lollipop 的手机。虽然它有效,但如果我也能解释原因,我会更高兴。所以我认为这更像是一个答案,但我想分享我的观察。

【讨论】:

  • 是的,这就是我最终要做的。我可能错误地指向了约束布局,我对 RelativeLayout 有同样的行为。
猜你喜欢
  • 2011-02-07
  • 2014-07-13
  • 2019-03-05
  • 2018-02-25
  • 2015-07-07
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多