问题描述
我正在尝试在片段的onCreateView方法中显示小吃店,但我不知道在小吃店内传递哪种视图。 我很困惑,因为我是第一次使用导航组件并查看绑定,也许是有问题的。 我尝试了binding.root,但遇到了这个异常:
之后,我尝试将requireView()。rootView作为参数,但我也遇到了这个异常:
java.lang.IllegalStateException:片段XFragment {7a091b5} (cefa1aef-59c3-4602-bcf1-b36f7d538cf9)id = 0x7f0800f7}未返回 来自onCreateView()的视图,或者在onCreateView()之前调用过此视图
我在XFragment中的代码:
package com.sdsd.sds
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.Navigation
import com.google.android.material.snackbar.Snackbar
import com.sdsd.sds.databinding.FragmentXBinding
private const val ARG_ParaM1 = "param1"
private const val ARG_ParaM2 = "param2"
class XFragment : Fragment() {
private var _binding: FragmenXBinding? = null
private val binding get() = _binding!!
private var param1: String? = null
private var param2: String? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
arguments?.let {
param1 = it.getString(ARG_ParaM1)
param2 = it.getString(ARG_ParaM2)
}
}
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
_binding = FragmentXBinding.inflate(inflater,container,false)
binding.tvFgRegistration.setonClickListener {
Navigation.findNavController(binding.root)
.navigate(R.id.action_f1_to_f2)
}
val snackbar: Snackbar = Snackbar.make(binding.root,"Succesful",Snackbar.LENGTH_LONG)
snackbar.show()
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
companion object {
@JvmStatic
fun newInstance(param1: String,param2: String) =
XFragment().apply {
arguments = Bundle().apply {
putString(ARG_ParaM1,param1)
putString(ARG_ParaM2,param2)
}
}
}
}
XML LAYOUT FILE:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ic"
tools:context=".XFragment">
<EditText
android:id="@+id/etE"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="16dp"
android:background="@color/translucent"
android:drawableStart="@drawable/ic_vector"
android:drawablePadding="5dp"
android:ems="10"
android:hint="@string/e_mail"
android:inputType="text"
android:textSize="25sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView" />
<EditText
android:id="@+id/etP"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="16dp"
android:background="@color/translucent"
android:drawableStart="@drawable/ic_vector"
android:drawablePadding="5dp"
android:ems="10"
android:hint="@string/password"
android:inputType="textPassword"
android:textSize="25sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/etE" />
<TextView
android:id="@+id/tvFgRegistration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="180dp"
android:layout_marginEnd="76dp"
android:layout_marginBottom="100dp"
android:text="@string/new_u"
android:textColor="@color/white"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
我只想在XFragment创建时显示带有消息的小吃店。
有人可以告诉我如何解决这个问题,并用几句话解释一下为什么吗?
解决方法
我找到了一个简单的解决方案,似乎Snackbar仅在以CoordinatorLayout作为根布局的情况下才能很好地发挥 ,因此我将CoordinatorLayout设置为XML文件中的根布局。
在Snackbar中,我只放置了 binding.coordinatorlayout ,其中coordinatorlayout只是XML文件中CoordinatorLayout的ID。
片段的代码解决方案在这里:
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
_binding = FragmentXBinding.inflate(inflater,container,false)
binding.tvFgRegistration.setOnClickListener {
Navigation.findNavController(binding.root)
.navigate(R.id.action_f1_to_f2)
}
val snackbar: Snackbar = Snackbar.make(binding.coordinatorlayout,"Succesful",Snackbar.LENGTH_LONG)
snackbar.show()
return binding.root
}
XML布局文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/coordinatorlayout" //ID OF COORDINATOR LAYOUT
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ic"
tools:context=".XFragment" >
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/ic_backg">
<EditText
android:id="@+id/etE"
android:layout_width="0dp"
.
.
.
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
,
我找到了几种从片段中显示小吃店的方法
解决方案之一是使用requireView()。
{ "editor.parameterHints": false }
当您在任何 onClickListner{} 中时,此解决方案将起作用,您只需将 it 作为视图传递,它就会完成工作。
Snackbar.make(
requireView(),"Hello from Snackbar",Snackbar.LENGTH_SHORT
).show()