在android开发中,会遇到父子控件共享同一点击事件的情况,针对这一情况进行学习处理。
如图所示布局:
该布局中LinearLayout中包含两个控件,Textview以及RadioButton。目前,只有RadioButton控件可以点击,如果想要实现整个Layout都可以点击的效果,并且在一次点击后,RadioButton状态为选中,再下一次点击后,RadioButton为为未选中的状态,就需要父子控件共享同一点击事件。
实现思路为:
首先,通过android:clickable="true",将父布局设置为可点击状态。
其次,通过android:clickable="false",将RadioButton设置为不可点击状态,并且设置状态跟随父布局android:duplicateParentState="true"。
最后,在mainActivity中,将点击事件进行处理。
实现效果:
点击一次:
再次点击:
具体代码如下:
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" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:id="@+id/test_layout" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:background="@color/cardview_light_background" android:clickable="true" android:orientation="horizontal" tools:ignore="MissingConstraints"> <TextView android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center" android:layout_margin="10dp" android:layout_weight="18" android:gravity="center" android:text="Hello World!" android:textSize="30dp" /> <RadioButton android:id="@+id/rbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_weight="2" android:clickable="false" android:duplicateParentState="true"></RadioButton> </LinearLayout> <androidx.constraintlayout.widget.Group android:id="@+id/group" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </androidx.constraintlayout.widget.ConstraintLayout>
mainActivity.java:
package com.example.parentviewdemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.LinearLayout; import android.widget.RadioButton; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ RadioButton btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = findViewById(R.id.rbtn); LinearLayout layout = findViewById(R.id.test_layout); layout.setOnClickListener(this); } /** * Called when a view has been clicked. * * @param v The view that was clicked. */ @Override public void onClick(View v) { if(v.getId() == R.id.test_layout){ if(btn.isChecked()){ btn.setChecked(false); }else{ btn.setChecked(true); } } } }