如何在 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(使用导航组件)