在 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)