代码之家  ›  专栏  ›  技术社区  ›  beastlyCoder

在片段Kotlin中调用DialogFragment

  •  0
  • beastlyCoder  · 技术社区  · 6 年前

    我试图调用我的dialogfragment到我的loginfragment中并显示一个警报对话框,show方法说:

    提供。显示(碎片管理器!,字符串!)定义于 显示(碎片事务!,字符串!)定义于 org.greenstand.android网站.TreeTracker.fragments.CustomDialogFragment

    val newFragment = CustomDialogFragment.newInstance("pass content here")
    
    val fm = fragmentManager
    newFragment.show(fm, "look")
    

    这是我的CustomDialogFragment代码:

    import android.app.Activity
    import android.content.Intent
    import android.content.pm.PackageManager
    import android.os.Bundle
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import android.widget.Toast
    import androidx.fragment.app.Fragment
    import androidx.lifecycle.Observer
    import kotlinx.android.synthetic.main.activity_main.*
    import kotlinx.android.synthetic.main.fragment_login.*
    import kotlinx.coroutines.Dispatchers
    import kotlinx.coroutines.GlobalScope
    import kotlinx.coroutines.launch
    import kotlinx.coroutines.withContext
    import org.greenstand.android.TreeTracker.R
    import org.greenstand.android.TreeTracker.application.Permissions
    import org.greenstand.android.TreeTracker.utilities.*
    import org.greenstand.android.TreeTracker.viewmodels.LoginViewModel
    import org.koin.android.viewmodel.ext.android.viewModel
    import timber.log.Timber
    class CustomDialogFragment : DialogFragment()
    {
        private var content: String? = null
    
        override fun onCreate(savedInstanceState: Bundle?)
        {
            super.onCreate(savedInstanceState)
            content = arguments!!.getString("content")
    
            val style = DialogFragment.STYLE_NO_FRAME
            val theme = R.style.DialogTheme
            setStyle(style, theme)
        }
    
    
        override fun onAttach(context: Context) {
            super.onAttach(context)
        }
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle): View
        {
            val view = inflater!!.inflate(R.layout.layout_dialog, container, false)
    
            val btnAccept = view.findViewById<View>(R.id.buttonAccept) as Button
    
            val textViewContent = view.findViewById<View>(R.id.textViewContent) as TextView
            textViewContent.text = content;
    
            btnAccept.setOnClickListener{
                dismiss();
            }
    
            return view;
        }
    
        companion object
        {
            fun newInstance(content: String) : CustomDialogFragment
            {
                val f = CustomDialogFragment()
    
                val args = Bundle()
                args.putString("content", content)
                f.arguments = args
    
                return f
            }
        }
    
    }
    

    有人能指出我到底需要传递什么到show方法中吗?感谢您的帮助,谢谢:)

    1 回复  |  直到 6 年前
        1
  •  3
  •   Mirjalal Edwin Dalorzo    5 年前

    [更新] 问题是这个方法可以接收 FragmentManager 但它必须不为null,请查看错误和不可为null的Kotlin符号

    FragmentManager!!

    所以你可以

    fm?.let {newFragment.show(fm, "your tag")}
    //fm here can also be it
    

    请看努沙德哈桑答案中的评论

    碎片管理器 对于方法,它需要 FragmentTransaction 和一个 String 作为标记:

    val transaction = supportFragmentManager.beginTransaction()
    newFragment.show(transaction, "SOME_TAG")
    

    几点建议:

    DialogFragment 更多 科特林尼 通过使用Kotlin标准函数

    companion object {
    
            private const val KEY = "param1"
    
            @JvmStatic
            fun newInstance(param1: String) =
                ExampleDialogFragment().apply {
                    arguments = bundleOf(KEY to param1)
                }
        }
    

    通过创建 Fragment 使用androidstudio向导并选中factory方法选项。

    还有,既然标签是给你的 对话片段

     companion object {
            const val TAG = "TAG"
     }
    

    也许您想再次检查对话框片段是否已经存在,并将其删除,以实际作为一个新的对话框工作

            val transaction = supportFragmentManager.beginTransaction()
            val previous = supportFragmentManager.findFragmentByTag(ExampleDialogFragment.TAG)
            if (previous != null) {
                transaction.remove(previous)
            }
            transaction.addToBackStack(null)
    
            val dialogFragment = ExampleDialogFragment.newInstance("parameter")
            dialogFragment.show(transaction, ExampleDialogFragment.TAG)
    
        2
  •  1
  •   TpoM6oH    6 年前

    确保你的活动是 https://developer.android.com/reference/androidx/fragment/app/FragmentActivity.html ,例如您可以使用 https://developer.android.com/reference/androidx/appcompat/app/AppCompatActivity

    然后使用 getSupportFragment() 方法,或者只是 val fm = supportFragmentManager

        3
  •  0
  •   Manzur Alahi    6 年前

    我看不到 DialogFragment customDialog() line no: 9 . 你确定你是从正确的 对话片段 ?