ViewFlipper的onTouch事件在其子Button的onClick事件发生时不会被触发

时间:2012-04-19 14:58:59

标签: android onclick

我一直在努力在StackOverflow或其他地方找到解决方案,但我找不到任何关于这个特定问题的直接帖子,可能除了可能最接近的那个我再也找不到了。但是,提前抱歉,如果这只是因为我忽略了某些东西或者我只是一个如此大的菜鸟。

无论如何,我正在尝试将OnTouchListener设置为ViewFlipper(父节点),并将setOnClickListener设置为按布局方式填充父节点的Button(子节点)。我希望首先调用ViewFlipper的onTouch()事件。如果ViewFlipper的onTouch()返回false,则会触发Button的onClick()。但是,只调用了Button的onClick()。为什么?是否有任何明确的优先权?

或者,我可以将onTouchListener设置为Button,因为Button具有'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 :(得分: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秒钟将手指从屏幕上移开,我不会称之为“点击”。