Android 片段上的类型不匹配
我正在开发一款Android应用程序,它使用Zxing扫描碎片上的二维码,为了达到这个目的,我遵循本教程获得了想要的结果 我用来扫描**QRCodeFragment**Fragment上的QR的代码看起来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
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正在扩展片段类和片段