Android - 从父级到子级传播点击

时间:2016-07-13 09:39:07

标签: android onclicklistener

我有一个LinearLayout,其中有几个TextView垂直堆叠。我想将一个点击监听器附加到父级,并使click事件传播到TextView之一(包含LinearLayout的子视图)。

我知道我可以将点击监听器附加到单个TextView并获得相同的结果,但我还是愿意这样做。

我遇到了

 android:duplicateParentState="true"

属性,但这似乎也解决了这个问题。我应该怎么做才能让子视图消耗包含父对象的click事件。此外,每个文本视图都应执行不同的操作。

这是布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/linear_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text_1"
        android:duplicateParentState="true"
        android:layout_marginBottom="10dp"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:duplicateParentState="true"
        android:text="Text_2" />

</LinearLayout>

这是活动:

public class MainActivity extends AppCompatActivity {

    LinearLayout mLinearLayout;
    TextView mTextView1;
    TextView mTextView2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mLinearLayout = (LinearLayout) findViewById(R.id.linear_layout);
        mLinearLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Log.v("view",view.toString());
            }
        });
    }
}

日志始终打印父视图:

    V/view: android.widget.LinearLayout{3ea32ab0 V.E...C. ...PH... 0,0-1080,1533 #7f0c0050 app:id/linear_layout}
    V/view: android.widget.LinearLayout{3ea32ab0 V.E...C. ...PH... 0,0-1080,1533 #7f0c0050 app:id/linear_layout}

我显然在这里遗漏了一些东西,希望解决方案不涉及导航视图堆栈。我做错了什么,任何帮助都会受到最高的赞赏。

1 个答案:

答案 0 :(得分:0)

您可以setOnTouchListener使用LinearLayout。在此OnTouchListener内,您需要检测到点击(GestureDetector可以提供帮助),此时您将获得MotionEvent,您可以从此事件获取x,y坐标并将其与您的{进行比较{1}}坐标。因此,您可以检测到哪个TextView被点击了。
通过这种方式,你可以做你想做的事,但这很复杂,我相信你可以避免它。