在 Kotlin 中调整对话框片段的大小

Posted

技术标签:

【中文标题】在 Kotlin 中调整对话框片段的大小【英文标题】:Resize the size of Dialog Fragment in Kotlin 【发布时间】:2021-12-09 03:31:59 【问题描述】:

我尝试了很多方法,但对话框的大小从未改变,我不知道但有时当我在对话框片段之外单击时,对话框片段没有关闭我的意思是在一些特殊的地方并定位它关闭。

这里是类:

class PopupWindowFragment : DialogFragment() 
    lateinit var mPopupWindowBinding: FragmentPopupWindowBinding
    lateinit var mPopupViewModel: PopupViewModel
    var id: Long = 0L
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? 
        mPopupWindowBinding =
            DataBindingUtil.inflate(
                layoutInflater,
                R.layout.fragment_popup_window,
                container,
                false
            )
        return mPopupWindowBinding.root
    

这里是导航:

<dialog
        android:id="@+id/navigation_dialog_fragment"
        android:name="com.example.holyquran.ui.popupWindow.PopupWindowFragment"
        tools:layout="@layout/fragment_popup_window">

编辑 这是布局:

<?xml version="1.0" encoding="utf-8"?>
    
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        <data>
        <variable
            name="viewModel"
            type="com.example.holyquran.ui.popupWindow.PopupViewModel" />

        <variable
            name="userName"
            type="com.example.holyquran.data.model.UserInfo" />

        <variable
            name="loan"
            type="com.example.holyquran.data.model.Loan" />
    </data>

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical"
        android:padding="20sp"
        tools:context=".ui.popupWindow.PopupWindowFragment">

        <LinearLayout
            android:layout_
            android:layout_>

            <TextView
                android:layout_
                android:layout_
                android:gravity="center"
                android:text="@userName.fullName"
                android:textColor="@color/black"
                android:textSize="25sp" />
        </LinearLayout>
        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="30dp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToIncrease()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_marginEnd="8dp"
                android:gravity="center"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <TextView
                android:layout_
                android:layout_
                android:layout_marginEnd="8dp"
                android:gravity="center"
                android:text="@string/submit_increase"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:layout_gravity="left"
                android:src="@drawable/ic_baseline_add_circle_24" />
        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToDecrease()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/submit_decrease"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/ic_baseline_add_circle_24" />
        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToLoan()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/submit_loan"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/ic_baseline_add_circle_24" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/payPaymentLL"
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToPayPayments()"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/noLoanForUser"
                android:layout_
                android:layout_
                android:gravity="center"
                android:text="@string/no_loan_user"
                android:textColor="@color/gray600"
                android:textSize="14sp"
                android:visibility="invisible" />

            <TextView
                android:id="@+id/payPayment"
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/pay_payment"
                android:textColor="@color/black"
                android:textSize="20sp" />


            <ImageView
                android:id="@+id/img"
                android:layout_
                android:layout_
                android:src="@drawable/ic_baseline_add_circle_24" />
        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="10dp"
            android:background="@color/gray500" />

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToLoanList()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/payments_list"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/ic_baseline_format_list_bulleted_24" />
        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToUserTransactionHistory()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/transaction_history"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/ic_baseline_format_list_bulleted_24" />
        </LinearLayout>

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="10dp"
            android:background="@color/gray500" />

        <LinearLayout
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.goToEditUserInfo()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/edit_user_info"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/ic_baseline_edit_24" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/deleteUser"
            android:layout_
            android:layout_
            android:layout_marginTop="20sp"
            android:gravity="right"
            android:layoutDirection="ltr"
            android:onClick="@() -> viewModel.deleteUser()"
            android:orientation="horizontal">

            <TextView
                android:layout_
                android:layout_
                android:layout_gravity="center"
                android:layout_marginEnd="8dp"
                android:text="@string/delete_user"
                android:textColor="@color/black"
                android:textSize="20sp" />

            <ImageView
                android:layout_
                android:layout_
                android:src="@drawable/ic_delete2" />
        </LinearLayout>
    </LinearLayout>
</layout>

我尝试过this 和even this,但没有一个有效。

感谢任何帮助:)

【问题讨论】:

请发布fragment_popup_window布局 我已经编辑了我的问题。请检查一下 对话框布局的宽度和高度已经采用match_parent.. 你想以编程方式调整它的大小吗? 我想让对话框片段比现在更小,因为对话框片段和手机底部之间没有太多空间。是的,我想通过程序来调整它的大小 【参考方案1】:

您可以通过更改对话窗口的大小来调整DialogFragment 的宽度和高度;

例如设置 300dp 宽度和 400dp 高度:

dialog!!.window!!.setLayout(
        300.toPx(requireContext()),
        400.toPx(requireContext())

但是在对话框布局视图创建之后执行此操作,如onViewCreated()onStart();不在onCreateView():

class PopupWindowFragment : DialogFragment() 

    //..... your rest of code

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)
        if (dialog != null) dialog!!.window!!.setLayout(
            300.toPx(requireContext()),
            400.toPx(requireContext())
        )

    private fun Int.toPx(context: Context): Int =
        (this * context.resources.displayMetrics.density).toInt()


我想让对话框片段比现在更小,因为对话框片段和手机底部之间没有太多空间。

现在你需要知道对话框的当前宽度和高度,这需要监听对话框的viewTreeObserver

向对话框的根 ViewGroup 添加一个 id (LinearLayout):比如dialog_root

<LinearLayout 
    android:id="@+id/dialog_root"

然后在根布局的 viewTreeObserver` 中更改高度和宽度:

class PopupWindowFragment : DialogFragment() 

    //..... your rest of code


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
        super.onViewCreated(view, savedInstanceState)

        mPopupWindowBinding.dialogRoot.viewTreeObserver.addOnGlobalLayoutListener(object :
            ViewTreeObserver.OnGlobalLayoutListener 
            override fun onGlobalLayout() 
                rootLayout.viewTreeObserver
                    .removeOnGlobalLayoutListener(this)

                // save default base layout width & height
                val height = rootLayout.height.toDp(requireContext())
                val width = rootLayout.width.toDp(requireContext())

                // change the width & height of the dialog (reduce by 50 dp)
                if (dialog != null) dialog!!.window!!.setLayout(
                    (width - 50).toPx(requireContext()),
                    (height - 50).toPx(requireContext())
                )
            
        )

    private fun Int.toPx(context: Context): Int =
        (this * context.resources.displayMetrics.density).toInt()

    fun Int.toDp(context: Context): Int = (this / context.resources.displayMetrics.density).toInt()


【讨论】:

谢谢,如果有帮助,我会将您的回答标记为已接受谢谢 这里是项目的链接,对话框片段在ui.popupWindow.popupWindowFragment中。我想知道你是否可以自己调整它的大小,因为我自己会出错谢谢一百万。 github.com/AmirAndroidDeveloper/Holy-Quran @AmirAndroidDeveloper 你想要this这样的东西吗? 您的链接有问题:media.giphy.com 响应时间过长。链接打不开 谢谢伙计。我还有另一个与 android 设计有关的问题。我会把它作为一个新问题发布,我想你知道答案。我会尽快发布这个问题,所以请检查我的个人资料,看看我是否问过这个问题。再次感谢

以上是关于在 Kotlin 中调整对话框片段的大小的主要内容,如果未能解决你的问题,请参考以下文章

Recycler View 和 DialogFragment 苦苦挣扎(Kotlin)

在tablayout viewpager中运行调整选项卡片段

试图在IE6中调整jQuery对话框的大小?

试图在 IE6 中调整 jQuery 对话框的大小?

在android中调整警报对话框的大小

为什么我的列表框没有调整大小? (动态调整对话框组件的大小)