supportFragmentManager 不适用于 kotlin

问题描述

我正在尝试使用 kotlin 使用 AlertDialog 类制作自定义对话框,我是如何做到的 首先是对话框的类

class CreateDialogForProduct : AppCompatDialogFragment() {
    lateinit var nameET: EditText
    lateinit var barcodeET: EditText
    lateinit var detailsET: EditText
    lateinit var saveBtn: Button


    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        var builder = AlertDialog.Builder(activity)
        val inflater = layoutInflater
        var view = inflater.inflate(R.layout.layout_dailog,null)
        builder.setView(view)
        builder.setTitle("Save Product")
        builder.setCancelable(true)

        nameET = view.findViewById(R.id.name_tv)
        barcodeET = view.findViewById(R.id.barcode_tv)
        detailsET = view.findViewById(R.id.details_tv)
        saveBtn = view.findViewById(R.id.save_btn)

        return builder.create()
    }
}

这是我在遇到问题的活动中如何称呼它

fun openDialog(){

    val dialog = CreateDialogForProduct()
    dialog?.show(supportFragmentManager,null)

}

它给了我一个错误,没有像 supportFragmentmanger 这样的方法,我检查了这个 answer 但它的解决方案对我不起作用,有什么帮助吗?

解决方法

如果你愿意,你可以从 AppCompatActivity 扩展你的活动,这不是你的问题,但像这样声明方法,它会为你工作

fun openDialog(){
    val dialog = CreateDialogForProduct()
    dialog.show((activity as FragmentActivity).supportFragmentManager,null)

}

完整的活动课就是这样

lateinit var fab: FloatingActionButton
lateinit var activity:Activity
var onClickListener = View.OnClickListener() {
    when (it.getId()) {
        R.id.floatingActionButton -> openDialog()
    }
}

fun openDialog(){
    val dialog = CreateDialogForProduct()
    dialog.show((activity as FragmentActivity).supportFragmentManager,null)

}
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        activity = this

        fab = findViewById(R.id.floatingActionButton)
        fab.setOnClickListener(onClickListener)
    }

}
,

supportFragmentManager中调用FragmentActivity应该没有问题。我不确定 openDialog() 是否在活动中定义。由于它是公共功能,我假设它是在对话框片段中定义的,并且您是从活动中调用它的。如果是这种情况,您应该将 openDialog() 放在您的活动类中。

编辑:您的函数超出类范围。它应该在类中像这样:

import android.app.Activity
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import com.amin.firebasevskotlin.R
import com.amin.firebasevskotlin.utils.CreateDialogForProduct
import com.google.android.material.floatingactionbutton.FloatingActionButton

lateinit var fab: FloatingActionButton

class MainActivity : FragmentActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    fab = findViewById(R.id.floatingActionButton)
    fab.setOnClickListener(onClickListener)
}

var onClickListener = View.OnClickListener() {
    when (it.getId()) {
        R.id.floatingActionButton -> openDialog()
    }
}

fun openDialog() {

    val dialog = CreateDialogForProduct()
    dialog?.show(supportFragmentManager,null)

}}
,

使用getActivity().getSupportFragmentManager() 要么 如果您在 api 21 中工作,请将 getSupportFragmentManager() 替换为 getFragmentManager()