如何在 ViewBinding 中使用片段?

Posted

技术标签:

【中文标题】如何在 ViewBinding 中使用片段?【英文标题】:How to use fragment with ViewBinding? 【发布时间】:2020-06-14 09:40:52 【问题描述】:

我想用 ViewBinding 创建一个片段,但我的代码不起作用。我读了ViewBinding Documentation,但我的片段没有显示。 这是我的代码:

fragment_player.xml

<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_>

<TextView
    android:layout_
    android:layout_
    android:text="Test fragment"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

layout_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_
android:layout_>

<fragment
    android:id="@+id/fragment_player"
    class="com.test.plo.view.PlayerFragment"
    android:name="com.test.plo.view.PlayerFragment"
    android:layout_
    android:layout_/>

</LinearLayout>

PlayerFragment.java

 public class PlayerFragment extends Fragment 

   private FragmentPlayerBinding fragmentPlayerBinding;

   @Nullable
   @Override
   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 

       fragmentPlayerBinding = FragmentPlayerBinding.inflate(inflater, container, false);
       View view = fragmentPlayerBinding.getRoot();
       return view;
   

  @Override
  public void onDestroyView() 
      super.onDestroyView();
      fragmentPlayerBinding = null;
  


谁能帮帮我?

【问题讨论】:

嗨结帐这篇文章完全解释了视图与活动的绑定|片段 |回收站视图|自定义视图Androidbites|ViewBinding 我在这里看到的最好的方法是将片段包装在 FrameLayout 中。 【参考方案1】:

你有没有试过把:

android 
    ...
    buildFeatures 
    viewBinding true
    

在您的应用 build.gradle 中?

【讨论】:

我建议不要在答案中使用修辞问题。他们冒着被误解为根本不是答案的风险。您正在尝试回答此页面顶部的问题,不是吗?否则请删除此帖。【参考方案2】:

首先,在您的应用级别中放入以下代码行

    android 
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig 
        applicationId "com.example.myapp"
        minSdkVersion 19
        targetSdkVersion 30
        versionCode 1          
        versionName "1.0"       
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    

    testOptions 
        unitTests.returnDefaultValues = true
    
    kotlinOptions 
        jvmTarget = '1.8'
    
    //Enable View Bindings to true
    buildFeatures 
        viewBinding = true
    

然后通过右键单击“文件”->新建->片段->选择空白片段(或您想要的任何片段)在您的项目中添加新片段。这将创建您的片段类文件以及与之关联的 xml 文件。 我创建了名为“HomeFragment.kt”的空白片段,其 xml 文件的名称为“fragment_home.xml”。

在我的 xml 文件中,我添加了一个 textview 和 Button(您可以在此处定义您的小部件 - 一种设计布局),代码如下所示。

“fragment_home.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:layout_
    android:layout_>



  <androidx.appcompat.widget.LinearLayoutCompat
            android:layout_
            android:layout_
            android:orientation="vertical">


                <com.google.android.material.textview.MaterialTextView
                    android:id="@+id/mTv_title"
                    android:layout_
                    android:layout_
                    android:text="Home Fragment"
                    android:textColor="@color/main_black"
                    android:lineSpacingExtra="@dimen/dimen_2dp"
                    android:gravity="center" />


 <com.google.android.material.button.MaterialButton
                    android:id="@+id/mBtn_homeButton"
                    android:layout_
                    android:layout_
                    android:text="Click Here!"
                    android:layout_gravity="center"
                    android:textSize="@dimen/dimen_20sp"
                    android:textAllCaps="false"
                    app:cornerRadius="@dimen/dimen_50dp"
                    android:paddingLeft="@dimen/dimen_50dp"
                    android:paddingRight="@dimen/dimen_50dp"
                    android:paddingTop="12dp"
                    android:paddingBottom="12dp" />

  </androidx.appcompat.widget.LinearLayoutCompat>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

最后在您的片段类中,您可以使用 viewBinding 绑定这些属性。 “HomeFragment.kt”

    class HomeFragment : Fragment() 

    private lateinit var homeViewModel: HomeViewModel
    // view binding will create an Class for your xml file, you can use it directly by this "FragmentHomeBinding" as my xml file name is "fragment_home.xml" 
 // create a variable of your xml binding class
    private lateinit var binding : FragmentHomeBinding 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        if (arguments!=null) 
            Log.i(tag, "onCreate: ")
        
    

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View 

        homeViewModel = ViewModelProvider(this).get(HomeViewModel::class.java)
        //val root = inflater.inflate(R.layout.fragment_home, container, false)
        binding = FragmentHomeBinding.inflate(inflater, container, false)

        // observe your text change by using viewModel
        homeViewModel.text.observe(viewLifecycleOwner, Observer 
            //you can use your view/widgets by using the binding object like this --- 
            binding.mTvTitle.text = it
        )

       // button click event -- using viewBinding 
       binding.mBtnHomeButton.setOnClickListener 
            Toast.makeText(context, "Hello..!", Toast.LENGTH_SHORT).show()
        
       

        return binding.root
    

干杯..!

【讨论】:

以上是关于如何在 ViewBinding 中使用片段?的主要内容,如果未能解决你的问题,请参考以下文章

Android NavHostFragment(片段)膨胀失败,ViewBinding(使用导航组件)

ViewBinding - 不同风格的布局资源

如何确定 Fragment 何时在 ViewPager 中可见

快速片段切换视图绑定 null

ViewBinding与RecycleView(一)

在片段中添加按钮? [复制]