繁体   English   中英

为什么我不能将视图绑定放在 onClick 监听器中?

[英]why i can't put view binding inside onClick listener?

我已经定义了这个:

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

和 onclick:

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)
            }
        }
    }

这是我的抽屉和内部配置文件 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 调用。请看下面的错误图片。

错误

when(v.!.id)表示您想使用具有特定 ID 的视图(像旧的 Java switch case或只是if(view.id == id)一样工作,所以 binding.tvNavSetting binding.tvNavSetting ->...应该是binding.tvNavSetting.id ->...目前您正在将视图 id 与整个视图对象本身进行比较

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

    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)  <<<-------
}

我们可以使用视图比较,而不是在 when( v.!.id ) 中使用视图 ID。

即先绑定监听器

    binding.bt1.setOnClickListener(this)
    binding.bt2.setOnClickListener(this)
    binding.bt3.setOnClickListener(this)
    binding.bt4.setOnClickListener(this)

然后

override fun onClick(view: View?) {
    binding.apply {
        when(view) {
            bt1 -> {
                println("bt1")
            }
            bt2 -> {
                println("bt2")
            }
            bt3 -> {
                println("bt3")
            }
            bt4 -> {
                println("bt4")
            }
        }
    }
}

由于binding.bt1仅提供View ,因此完美运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM