Android 片段上的类型不匹配

Android 片段上的类型不匹配,android,kotlin,android-fragments,fragment,android-fragmentactivity,Android,Kotlin,Android Fragments,Fragment,Android Fragmentactivity,我正在开发一款Android应用程序,它使用Zxing扫描碎片上的二维码,为了达到这个目的,我遵循本教程获得了想要的结果 我用来扫描**QRCodeFragment**Fragment上的QR的代码看起来 class QRCodeFragment : Fragment() { internal var txtName: TextView? = null internal var txtSiteName: TextView? = null internal var btnScan: Button

我正在开发一款Android应用程序,它使用Zxing扫描碎片上的二维码,为了达到这个目的,我遵循本教程获得了想要的结果

我用来扫描**QRCodeFragment**Fragment上的QR的代码看起来

class QRCodeFragment : Fragment() {

internal var txtName: TextView? = null
internal var txtSiteName: TextView? = null
internal var btnScan: Button? = null
internal var qrScanIntegrator: IntentIntegrator? = null


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater?.inflate(R.layout.fragment_qr_code, container, false)
}


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

    txtName = view.findViewById(R.id.name)
    txtSiteName = view.findViewById(R.id.site_name)

    btnScan = view.findViewById(R.id.btnScan)
    btnScan!!.setOnClickListener { performAction() }

    qrScanIntegrator = IntentIntegrator.forFragment(this)
    qrScanIntegrator?.setOrientationLocked(false)

    // Different Customization option...
    qrScanIntegrator?.setPrompt(getString(R.string.scan_a_code))
    qrScanIntegrator?.setCameraId(0)  // Use a specific camera of the device
    qrScanIntegrator?.setBeepEnabled(false)
    qrScanIntegrator?.setBarcodeImageEnabled(true)

    super.onViewCreated(view, savedInstanceState)
}

private fun performAction() {
    qrScanIntegrator?.initiateScan()
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    val result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data)
    if (result != null) {
        // If QRCode has no data.
        if (result.contents == null) {
            Toast.makeText(activity, R.string.result_not_found, Toast.LENGTH_LONG).show()
        } else {
            // If QRCode contains data.
            try {
                // Converting the data to json format
                val obj = JSONObject(result.contents)
                // Show values in UI.
                txtName?.text = obj.getString("name")
                txtSiteName?.text = obj.getString("site_name")

            } catch (e: JSONException) {
                e.printStackTrace()

                // Data not in the expected format. So, whole object as toast message.
                Toast.makeText(activity, result.contents, Toast.LENGTH_LONG).show()
            }

        }
    } else {
        super.onActivityResult(requestCode, resultCode, data)
    }
}
}

从主要活动中,我称之为片段

    private fun ShowQRCodeFragment() {
    val newFragment = QRCodeFragment()
    val transaction1: FragmentTransaction = supportFragmentManager.beginTransaction();
    transaction1.replace(R.id.frameLayout, newFragment);
    transaction1.addToBackStack(null);
    transaction1.commit();
}
在主片段中,它向我显示类型不匹配,我指出它指向扩展Fragment()

错误图像外观

如果我更改此项,它将显示活动上的错误,从这里我调用扫描QR片段

我想这是因为你们进口的


您需要将您的导入从
android.support.v4.app.Fragment
更改为
android.app.Fragment
,反之亦然

我认为这是因为您的导入


您需要将导入从
android.support.v4.app.Fragment
更改为
android.app.Fragment
,反之亦然您的
QRCodeFragment
类正在扩展
Fragment
,哪个?(选中文件顶部的
import
s)

我们有和选择适当的需要你的方法


内置的
android.app.Fragment
目前已被弃用,您应该使用
androidx
版本,但有些库仍然需要原始版本(遗憾的是)

您的
QRCodeFragment
类正在扩展
Fragment
,这是什么?(选中文件顶部的
import
s)

我们有和选择适当的需要你的方法


内置的
android.app.Fragment
目前已被弃用,您应该使用
androidx
版本,但有些库仍然需要原始库(遗憾的是)

在onViewCreated中,您首先要做自己的事情,然后调用super.onViewCreated

这是指基本片段实例,当您的代码在super调用之前运行时,它假设您的片段类型片段而不是QRCodeFragment 为了解决这个问题

首先在onViewCreated中调用super.onViewCreated,然后执行代码部分

这样做-

override fun onViewCreated(view:View, savedInstanceState:Bundle? ) 
{
 super.onViewCreated(view, savedInstanceState) 
//your code part
} 


在onViewCreated中,您首先做自己的事情,然后调用super.onViewCreated

这是指基本片段实例,当您的代码在super调用之前运行时,它假设您的片段类型片段而不是QRCodeFragment 为了解决这个问题

首先在onViewCreated中调用super.onViewCreated,然后执行代码部分

这样做-

override fun onViewCreated(view:View, savedInstanceState:Bundle? ) 
{
 super.onViewCreated(view, savedInstanceState) 
//your code part
} 


如果您的
QRCodeFragment
扩展了
androidx.fragment.app.fragment
,那么您应该使用
IntentIntegrator.forSupportFragment

如果您的
QRCodeFragment
扩展了
androidx.fragment.app.fragment
,那么您应该使用
IntentIntegrator.forSupportFragment

尝试找出问题所在提供的和请求的类的全名(包括包)。一个可能来自AndroidX或支持库,另一个来自主API。请尝试查找提供的和请求的类的全名(包括包)。一个可能来自AndroidX或support library,另一个来自主API。检查您的方法需要哪个
Fragment
,例如
forFragment
。按住ctrl/cmd按钮并单击它,将打开带有类的选项卡,然后在内部按住ctrl/cmd并将光标移动到
Fragment
类上,该类是方法的参数-您将看到所需的
Fragment
的完整包。除此之外,与其他建议一样:
super.onViewCreated
应该是重写方法中的第一个调用,但我仍然不认为这会导致您的问题……也许还有其他方法:尝试将
QRCodeFragment:Fragment
替换为
QRCodeFragment:android.app.Fragment
QRCodeFragment:androidx.Fragment.app.Fragment
——在每次更改后进行干净的构建(android Studio->构建->重建项目)@Dev Bhattacharjee-您能解释一下为什么这个更改应该解决这个问题吗?这是说类型不匹配和移动某些行肯定不会改变类型…因为QRCodeFragment正在扩展片段类,而片段实现需要调用基类函数。。在他的例子中,这是指基类片段,而不是QRCodeFragment。为了解决这个问题,他需要先调用super.onViewCreated.imho:Usman有两个问题,一个是类不匹配(由发布的异常指出),我的回答帮助了他。你们发现了另一个问题,并用错位的线条回答了潜在的“未来”问题。我们的两篇帖子都有帮助,但我的帖子仍然在回答帖子的问题和你的投票,因为这也很有帮助,“最终”让他的代码工作起来,检查你的方法所需要的
Fragment
,例如
forFragment
。按住ctrl/cmd按钮并单击它,将打开带有类的选项卡,然后在内部按住ctrl/cmd并将光标移动到
Fragment
类上,该类是方法的参数-您将看到所需的
Fragment
的完整包。除此之外,与其他建议一样:
super.onViewCreated
应该是重写方法中的第一个调用,但我仍然不认为这会导致您的问题……也许还有其他方法:尝试将
QRCodeFragment:Fragment
替换为
QRCodeFragment:android.app.Fragment
QRCodeFragment:androidx.Fragment.app.Fragment
——在每次更改后进行干净的构建(android Studio->构建->重建项目)@Dev Bhattacharjee-您能解释一下为什么这个更改应该解决这个问题吗?这是说类型不匹配和移动某些行肯定不会改变类型…因为QRCODEFREGRAGE正在扩展片段类和片段