ViewFlipper的onTouch事件不会触发,而其子Button的onClick事件会触发。

3
我一直在StackOverflow或其他地方努力寻找解决方案,但我没有找到任何关于这个特殊问题的直接帖子,除了可能最接近的一个,我不再能找到了。不过,如果这只是因为我忽略了什么或我太菜了,那么请提前谅解。
无论如何,我正在尝试将OnTouchListener设置为ViewFlipper(父级),并将OnClickListener设置为一个填充父布局的按钮(子级)。我希望ViewFlipper的onTouch()事件首先被调用。我认为如果ViewFlipper的onTouch()返回false,则会触发Button的onClick()。然而,实际上只有Button的onClick()被调用了。为什么?是否有定义好的优先级?
作为替代方案,我可以为该按钮设置一个onTouchListener,因为该按钮具有“match_parent”属性,因此触摸该viewflipper实际上与触摸该按钮相同。即使我这样做了,它也只是使Button的onClick()事件未触发...
以下是我的简化活动;
public class TestActivity extends Activity implements OnTouchListener, View.OnClickListener {
@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    ViewFlipper vf = (ViewFlipper) findViewById(R.id.viewFlipper1);
    Button btn = (Button) this.findViewById(R.id.btnTest1);
    vf.setOnTouchListener(this);
    btn.setOnClickListener(this);

}

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ViewFlipper
    android:id="@+id/viewFlipper1"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <include
        android:id="@+id/button"
        layout="@layout/test" />
</ViewFlipper>
</LinearLayout>

test.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/testLinear"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:baselineAligned="false"
android:orientation="vertical" >
<Button
    android:id="@+id/btnTest1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:text="Button" />
</LinearLayout>
1个回答

0

我仍然不明白为什么ViewFlipper的onTouch事件没有被首先调用,但我找到了一种方法来逃避这个问题。我们可以将按钮同时设置为onClickListener和onTouchListener。

btn.setOnClickListener(this);
btn.setOnTouchListener(this);

正如原帖中所述,它可以防止 onClick() 事件的发生,但是无论如何?如果它没有被 Android 系统调用,那么我们就应该手动调用它。

@Override public boolean onTouch (View v, MotionEvent event) {

// walls of codes 

this.onClick(v);

我知道我需要一些调整。如果用户在0.5秒内将手指离开屏幕,我不会称之为“点击”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接