如何解决FrameLayout中的onClickListener和setTouchListener冲突?

时间:2019-01-04 09:55:28

标签: android view onclicklistener

我有一个包含TextView的FrameLayout,我将OnTouchListener添加到FrameLayout中以执行translateX作业。然后将OnClickListener添加到TextView来更改文本。然后,FrameLayout无法翻译X。

如何解决此冲突?我希望TextView可以执行单击运算符,而FrameLayout可以执行translationX。

有人可以帮助我吗?谢谢!

布局

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/panel"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"/>
</FrameLayout>    

然后在“活动”中

public class MainActivity3 extends AppCompatActivity {

    float downX = 0;

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

        FrameLayout panel = findViewById(R.id.panel);
        panel.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        downX = event.getX();
                        return true;
                    case MotionEvent.ACTION_MOVE:
                        float dx = event.getX() - downX;
                        panel.setTranslationX(dx);
                        return true;
                    case MotionEvent.ACTION_UP:
                        return true;
                }
                return false;
            }
        });

        TextView textView = findViewById(R.id.textView);
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                textView.setText("this is textview click");
            }
        });
      }
}

2 个答案:

答案 0 :(得分:0)

您的问题是TextView上的match_parent属性占用了整个可用空间。将match_parent更改为wrap_content,它应该可以正常工作。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/panel"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"/>
</FrameLayout>  

您的FrameLayout触发器隐藏在TextView的后面,因为TextView已接管了所有可用空间。

答案 1 :(得分:0)

首先,您必须使textView可见Rect

Rect visibleRect = new Rect();
yourTextView.getGlobalVisibleRect();

然后检查您的触摸事件坐标

if (event.getX()>= visibleRect.left and event.getX()<=visibleRect.right and 
   event.getY>=visibleRect.bottom and event.getY<= visibleRect.top)
   {
   //perform click on textView
   return
   }