android-fragments 如果我使用视图绑定和导航组件,如何在fragment的onCreateView方法中找到Snackbar的视图?

zpqajqem  于 2022-11-14  发布在  Android
关注(0)|答案(3)|浏览(102)

我试图在fragment的onCreateView方法中显示一个小吃店,但我不知道该在小吃店内部传递什么视图。我很困惑,因为我第一次使用Navigation组件和视图绑定,可能有问题。我尝试绑定.root,但我得到了以下异常:
异常错误:在给定视图中未找到合适的父级。请提供有效的视图。
之后,我尝试将requireView().rootView作为参数,但也出现了以下异常:
java.lang.IllegalStateException:片段XFragment{7a 091 b5}(cefa 1aef-59 c3 -4602-bcf 1-b36 f7 d538 cf 9)id= 0x 7 f0800 f7}未从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创建时显示一个带有消息的小吃店。

有人能告诉我如何解决这个问题并用几句话解释为什么吗

ymdaylpp

ymdaylpp1#

我找到了几种方法来显示一个小吃店
解决方法之一是使用requireView()

Snackbar.make(
            requireView(),
            "Hello from Snackbar",
            Snackbar.LENGTH_SHORT
        ).show()

当您在任何onClickListner{}中时,只要将作为一个视图传递,它就可以完成这项工作。

binding.button.setOnClickListener {
       Snackbar.make(
                it,
                "Hello from Snackbar",
                Snackbar.LENGTH_SHORT
            ).show()
}
ni65a41a

ni65a41a2#

我找到了一个简单的解决方案,看起来Snackbar工作得很好***,只有将CoordinatorLayout作为根布局***,所以我在XML文件中将CoordinatorLayout设置为根布局。
在Snackbar中,我只是放置了binding.coordinatorlayout,其中coordinatorlayout只是XML文件中的一个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>
slmsl1lt

slmsl1lt3#

我在使用导航体系结构时也遇到了同样的问题。
对我有用的是

if(isAdded){
Snackbar.make(requireActivity.window.decorView.rootView,"message").show()
}

相关问题