【问题标题】:DialogFragment with no title shrinks dialog width没有标题的 DialogFragment 会缩小对话框宽度
【发布时间】:2017-03-25 18:45:41
【问题描述】:

目标是创建一个显示文件列表的对话框。

问题是,一旦我删除了标题(通过任何方式,包括窗口功能、设置样式、使用 styles.xml...),对话框窗口就会转换为 wrap_content 约束。

我在布局中设置的任何属性都不会影响这一点。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

    <TextView
        android:id="@+id/dialog_files_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"
        android:padding="8dp"
        android:text="@string/dialog_files_title"
        android:textColor="@color/colorTextActive"
        android:textAppearance="@style/Base.TextAppearance.AppCompat.Title" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/dialog_files_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp" />

</LinearLayout>

我的java代码

public Dialog onCreateDialog(Bundle savedInstanceState) {

        Dialog dialog = super.onCreateDialog(savedInstanceState);

        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return dialog;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        @SuppressLint("InflateParams") View view = inflater.inflate(R.layout.dialog_files, null);

        paths = new ArrayList<>();
        recursiveScan(Environment.getExternalStorageDirectory());
        RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.dialog_files_recycler_view);
        GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 3);
        AdapterFiles adapter = new AdapterFiles(getActivity(), paths);

        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setAdapter(adapter);

        return view;

    }

结果是这样的

【问题讨论】:

    标签: java android xml user-interface material-design


    【解决方案1】:
    Dialog dialog = super.onCreateDialog(savedInstanceState);
    
    WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    
    Window window = dialog.getWindow();
    
    if (window != null) {
          window.requestFeature(Window.FEATURE_NO_TITLE);
          window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT);
    }
    
    return dialog;
    

    试试这个。

    【讨论】:

    • 感谢回复,请解释一下为什么声明LayoutParams而不使用它们。
    【解决方案2】:

    问题似乎出在使用LinearLayout 作为根布局时。我切换到RelativeLayout 一切都已到位。也许这是在使用LinearLayout 作为对话框中的根布局并删除标题时出现的错误?

    【讨论】:

    • 关于根布局的 IDK,但为了获得一个好的对话框,我所做的是在 onCreateDialog() 中创建新的 AlertDialog 并将自定义视图设置为对话框上的 setView(),而不是在onCreateView().
    • @Yaroslav Mytkalyk 我避免使用 AlertDialog,因为我需要自定义按钮的外观和位置。但我想这只是个人实践。
    • AlertDialog 具有控制其尺寸的样式属性。无论如何,您仍然可以通过在对话框视图中添加按钮来使用 AlertDialog,而不是在对话框生成器中将它们添加为 setPositiveButton
    • 绝对正确。这发生在your_dialog_layout.xml 中作为父级的线性布局。 PS-几年前我遇到了这个问题。然后今天又遇到了这个,但忘记了我过去是如何解决这个问题的。你提醒了我!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-02
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多