Android Dialog之DialogFragment详解与使用

这篇具有很好参考价值的文章主要介绍了Android Dialog之DialogFragment详解与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、介绍

        在Android开发过程中,经常会有弹窗业务,在正常的弹窗业务中,常用到的是Dialog,Dialog的原理也是通过将view,添加到Dialog中。Dialog自身是一个独立的窗口,和Activity一样,有自己的window管理。如果简单的使用Dialog不方便管理,在后面Google提供了DialogFragment弹窗。

二、DialogFragment的介绍

        看到DialogFragment,从单词可以看到是Dialog与Fragment组合而成,但是在DialogFragment中,DialogFragment其实是一个fragment,内部持有一个Dialog,这样方便了开发者的管理。fragment在碎片管理中其实就是一个View,最终view的显示是通过dialog来完成。

        class NamelessClass_1 implements Observer<LifecycleOwner> {
            NamelessClass_1() {
            }

            @SuppressLint({"SyntheticAccessor"})
            public void onChanged(LifecycleOwner lifecycleOwner) {
                if (lifecycleOwner != null && DialogFragment.this.mShowsDialog) {
                    View view = DialogFragment.this.requireView();
                    if (view.getParent() != null) {
                        throw new IllegalStateException("DialogFragment can not be attached to a container view");
                    }

                    if (DialogFragment.this.mDialog != null) {
                        if (FragmentManager.isLoggingEnabled(3)) {
                            Log.d("FragmentManager", "DialogFragment " + this + " setting the content view on " + DialogFragment.this.mDialog);
                        }

                        DialogFragment.this.mDialog.setContentView(view);
                    }
                }

            }
        }

 同样,在类中也提供了丰富的方法

1、显示

    public void show(@NonNull FragmentManager manager, @Nullable String tag) {
        this.mDismissed = false;
        this.mShownByMe = true;
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commit();
    }

2、消失

    public void dismiss() {
        this.dismissInternal(false, false);
    }

3、获取dialog

    @Nullable
    public Dialog getDialog() {
        return this.mDialog;
    }

4、初始化内部资源

  @Nullable
    View onFindViewById(int id) {
        return this.mDialog != null ? this.mDialog.findViewById(id) : null;
    }

5.dialog创建


    @MainThread
    @NonNull
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        if (FragmentManager.isLoggingEnabled(3)) {
            Log.d("FragmentManager", "onCreateDialog called for DialogFragment " + this);
        }

        return new Dialog(this.requireContext(), this.getTheme());
    }

三、实战

通过以上介绍,我们大概熟悉了DialogFragment的大概工作方式,如果想仔细研究,可以查看源码。

在实战使用中

1、继承重写

基类:

abstract class BaseBindDialogFragment<V : ViewDataBinding> : DialogFragment() {

    val TAG=javaClass::class.java.name
    lateinit var bind: V

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        bind = DataBindingUtil.inflate(inflater, getLayoutId(), container, false)

        initView(bind.root)
        return bind.root
    }


    override fun onStart() {
        super.onStart()
        initConfig(dialog)
    }

    @LayoutRes
    abstract fun getLayoutId(): Int

    abstract fun initView(view: View)

    abstract fun initConfig(dialog:Dialog?)


}
class MyDialogFrgament : BaseBindDialogFragment<DialogFragmentbind>() {

    override fun getLayoutId(): Int {
        return R.layout.layout_dialog_view
    }

    override fun initView(view: View) {

        bind.textInfo.text="我在测试"
    }

    override fun onResume() {
        super.onResume()
        MyLog.log(TAG,"onResume")
    }

    override fun onPause() {
        super.onPause()
        MyLog.log(TAG,"onPause")
    }

    override fun onStop() {
        super.onStop()
        MyLog.log(TAG,"onStop")
    }

    override fun initConfig(dialog: Dialog?) {
        dialog?.let {

        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data class="DialogFragmentbind"></data>

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">


        <TextView
            android:id="@+id/text_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </FrameLayout>
</layout>

执行:

    private fun dialogExport() {
        dialog = MyDialogFrgament()
        dialog.show(supportFragmentManager, "dialogExport")
    }

注意:

在开发过程中,好多新手会报错:

DialogFragment can not be attached to a container view

android dialogfragment使用,kotlin,解决方案,android,android,android studio,dialog,kotlin

 

报错这个问题的原因是view的parent不为null,在消失后,又重新显示,这个时候会校验parent是否为null。

发生这个问题的核心是语法使用

android dialogfragment使用,kotlin,解决方案,android,android,android studio,dialog,kotlin

解决:

1.获取view的parent,通过remove自己

2.每次展示的时候重新new一个对象文章来源地址https://www.toymoban.com/news/detail-604091.html

到了这里,关于Android Dialog之DialogFragment详解与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Dialog 显示不全的问题

    前言:开发的时候发现一些运行到手机里的dialog显示不全,只显示一半左右  问了下chatgpt发现没有任何头绪,于是开始自己慢慢分析 显示去掉了原有的dialog的style发现问题解决了,但在原有基础上如何解决呢? 先看看xml,发现设置了宽高都不起作用 使用LayoutInspector查看发现

    2024年01月23日
    浏览(50)
  • Android——自定义Dialog的两种常见方式

    通常我们只需要关注三个回调方法: onCreateDialog:创建一个dialog外壳 onCreateView:给dialog外壳填充自己想要的样式布局 onViewCreated:这里面给布局的view进行初始化操作,可以设置一些监听器等等 事例: 自定义布局文件:随便写一个

    2024年02月16日
    浏览(29)
  • Android解决Dialog触碰外面不能自动关闭问题

    Android解决Dialog触碰外面不能自动关闭问题,其实也就是解决dialog.setCanceledOnTouchOutside(true) 不生效问题 为什么设置了dialog.setCanceledOnTouchOutside(true) 会不生效呢? 问题根源在styles文件中定义android:windowIsFloating=false导致: android:windowIsFloating 表示Dialog是否浮现在activity之上, 当将

    2024年02月11日
    浏览(25)
  • 【Android】Dialog不显示的问题,涉及线程处理问题

    在逻辑处理的时候挂了一线程监听网络回调的数据,这样就不会卡在UI没有任何表现导致用户以为死机了。这样的处理方式也是常规的网络处理方式。 结我在成功回调中就简单构造一个dialog来弹出信息展示,结果debug发现明明走到了 create 和 show 方法中,但是就是没有出现在

    2024年02月06日
    浏览(24)
  • 【Android】怎么把一个自定义Dialog弄成一个圆形的

    自定义一个Dialog,做成圆形 实现步骤: 创建XML布局 使用自定义的布局文件创建 Dialog

    2024年02月11日
    浏览(33)
  • Android sweet-alert-dialog 自定义按钮背景颜色

    sweet-alert-dialog这个怎么在项目中引入,我这里就不说了 大家可以看一下GitHub:GitHub - pedant/sweet-alert-dialog: SweetAlert for Android, a beautiful and clever alert dialog 我这里直接说明如何改弹窗的背景色 1.在你的styles中添加 按钮 样式:  2.添加drawable文件blue_button_background 在blue_button_backgrou

    2024年04月16日
    浏览(36)
  • Android12窗口模糊(一)在Activity和Dialog中实现高斯模糊效果

    在 Android 12 中,提供了一些用于实现窗口模糊处理效果(例如背景模糊处理和模糊处理后方屏幕)的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。 有两种窗口模糊处理方式,可用于实现不同的视觉效果: 背景模糊处理(Background blur):可用于

    2023年04月19日
    浏览(69)
  • 【Android】Dialog弹出软键盘时把布局顶起来的实现

    demo效果如下: 软键盘和EditText保持一定间距的实现思路,可以设置EditText 的 paddingBottom

    2024年01月20日
    浏览(34)
  • Android全屏弹出Dialog显示状态栏和导航栏的问题及解决方案

    在移动端开发中,有时候我们需要在Android应用中弹出一个全屏的Dialog。然而,当我们尝试实现这样的Dialog时,可能会遇到一个问题:状态栏和导航栏在全屏Dialog中仍然可见,这可能会影响用户体验。本文将介绍如何解决这个问题,并提供相应的源代码。 问题描述: 当我们使

    2024年02月05日
    浏览(33)
  • Android Room 使用详解

    介绍 Room是Google提供的一个ORM库。Room提供了三个主要的组件: @Database:@Database用来注解类,并且注解的类必须是继承自RoomDatabase的抽象类。该类主要作用是创建数据库和创建Daos(data access objects,数据访问对象)。 @Entity:@Entity用来注解实体类,@Database通过entities属性引用被

    2024年02月13日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包