【问题标题】:View binding for menu files?查看菜单文件的绑定?
【发布时间】:2020-11-12 08:53:28
【问题描述】:

是否可以在菜单资源中使用View Binding(或Data Binding)?

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.menu_main, menu)
    
    // search using ID - can this be replaced by view binding?
    val searchView = menu.findItem(R.id.menu_search).actionView as SearchView
}

【问题讨论】:

    标签: android android-databinding android-menu android-viewbinding


    【解决方案1】:

    在大多数情况下,视图绑定会替换 findViewById

    根据documentations

    视图绑定是一项功能,可以让您更轻松地编写代码 与视图交互的。在模块中启用视图绑定后, 它为该模块中存在的每个 XML 布局 文件生成一个绑定类。

    在菜单中它使用findItem() 而不是findViewById() 方法。

    【讨论】:

      【解决方案2】:

      目前dataBinding仅用于布局资源,不用于菜单资源。

      【讨论】:

        【解决方案3】:

        特定于 View Binding 带有自定义 xml 视图的菜单项,不是 Data Binding

        partial_menu_sample_view.xml

        <?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"
            android:layout_width="?actionBarSize"
            android:layout_height="?actionBarSize"
            android:clipToPadding="false"
            android:focusable="true">
        
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:contentDescription="@null"
                android:src="@drawable/ic_sample"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
        
        
            <TextView
                android:id="@+id/textview_sample"
                android:visibility="gone"
                app:layout_constraintBottom_toTopOf="@id/guideline_horizontal_center"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="@id/guideline_vertical_center"
                app:layout_constraintTop_toTopOf="parent" />
        
        </androidx.constraintlayout.widget.ConstraintLayout>
        
        

        activity_sample.xml

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
        
          <androidx.appcompat.widget.Toolbar 
            android:id="@+id/toolbar_sample"/>
        
        </LinearLayout>
        

        SampleActivity.kt

        class SampleActivity() {
        
          lateinit var binding: ActivitySampleBinding
          var menuSampleViewBinding: PartialMenuSampleViewBinding? = null
        
          ...
        
          override fun onCreate() {
            super.onCreate()
            binding = ActivitySampleBinding.inflate(layoutInflater)
            setContentView(binding.root)
            // make sure to set the toolbar
            setSupportActionBar(binding.toolbarSample)
          }
        
          ...
        
          override fun onCreateOptionsMenu() {
              // inflate the menu to show on your toolbar
              // replace with your own menu xml
              binding.toolbarProduct.inflateMenu(R.menu.activity_sample)
              
              with(binding.toolbarProduct.menu) {
                    findItem(R.id.menu_item_cart)?.actionView?.let {
                        menuSampleViewBinding = PartialMenuSampleViewBinding.bind(it)
                    }
                    // handle other menu items here
              }
          }
        
          ...
        
          fun customFunction() {
              // use as needed
              menuSampleViewBinding?.textviewSample?.text = "1"
              menuSampleViewBinding?.root?.setOnClickListeners { /* add what you need */ } 
          }
        
        }
        

        在菜单项上有徽章计数的用例中使用它。工作正常。

        【讨论】:

          猜你喜欢
          • 2017-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-04
          • 2016-07-14
          • 2014-07-20
          • 2018-09-14
          • 2011-04-22
          相关资源
          最近更新 更多