【问题标题】:why i can't put view binding inside onClick listener?为什么我不能将视图绑定放在 onClick 侦听器中?
【发布时间】:2021-02-12 09:03:08
【问题描述】:

我已经定义了这个:

class ProfileFragment : Fragment(), View.OnClickListener {}

和点击:

override fun onClick(v: View?) {
        when (v!!.id) {
            binding.tvNavSetting -> {
                avoidDoubleClicks(binding.tvNavSetting)
                val intent = Intent(requireContext(), SettingsActivity::class.java)
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
                startActivity(intent)
            }
        }
    }

这是我的抽屉和 Profile Fragment.xml 内部:

    <com.google.android.material.navigation.NavigationView
                    app:elevation="10dp"
                    android:id="@+id/nav_view"
                    android:paddingBottom="100dp"
                    android:layout_width="wrap_content"
                    android:layout_height="match_parent"
                    android:layout_gravity="end"
                    android:background="@color/white"
                    android:fitsSystemWindows="false">
    
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="vertical">
    
                        <androidx.appcompat.widget.SearchView
                            android:layout_width="match_parent"
                            android:layout_height="40dp"
                            android:id="@+id/seach_view"
                            android:background="@drawable/bg_search"
                            android:layout_marginHorizontal="10dp"
                            android:layout_marginVertical="10dp"/>
    
// this is what i try to call://// 
                        <TextView
                            android:id="@+id/tv_nav_setting"
                            android:text="awdadw"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:textColor="@color/black" />
    
                        <View
                            android:layout_width="match_parent"
                            android:layout_height="1dp"
                            android:layout_marginStart="20dp"
                            android:layout_marginEnd="40dp"
                            android:background="@drawable/drawer_bg" />
    
                    </LinearLayout>
    
                    <Button
                        android:id="@+id/btn_keluar_profile"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:text="Keluar"
                        android:layout_margin="10dp"
                        android:textColor="@color/white"
                        android:background="@drawable/bg_btn_login"
                        android:layout_gravity="bottom"/>
    
                </com.google.android.material.navigation.NavigationView>

我在 Fragment 内的抽屉导航中有文本视图。我想在该抽屉导航中处理点击,但文本视图无法通过 viewBinding 调用。请看下面的错误图片。。

【问题讨论】:

    标签: android kotlin android-viewbinding


    【解决方案1】:

    when(v!!.id) 表示您想使用具有特定 ID 的视图(类似于旧 Java switch case 或只是 if(view.id == id),所以 binding.tvNavSetting -&gt; ... 应该是 binding.tvNavSetting.id -&gt; ...。目前您正在将视图 ID 与整个视图对象进行比较自己

    【讨论】:

    • 对不起,但是 -->> binding.tvNavSetting.id 没有用,最近我才找到答案.. -
    • 能否请您发布您的 IDE 与 binding.tvNavSetting.id 有什么样的问题?消息是什么?
    【解决方案2】:

    对不起,我忘了添加这个:

        override fun onClick(v: View?) {
        when (v!!.id) {
            R.id.tv_nav_setting -> {   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                avoidDoubleClicks(binding.tvNavSetting)
                val intent = Intent(requireContext(), SettingsActivity::class.java)
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
                startActivity(intent)
            }
        }
    }
    
    /*adding this line solve the problem*/
    private fun setDrawer() {
        binding.drawerLayout.setScrimColor(Color.TRANSPARENT)
        binding.tvNavSetting.setOnClickListener(this)  <<<-------
    }
    

    【讨论】:

    • 好吧,这行得通,但这不是正确的方法。为不处理Views 的“手动”ID 引入了绑定模式。如果你有自动绑定视图,那么你应该获取它的id,而不是手动引用,因为你可能会在这里犯一些错误并且不会发生点击。对于这种情况,引入了绑定——避免这样的“错误”
    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多