0

线性布局的触摸事件会弹出多个屏幕。似乎对于线性布局的每个子元素,ontouch 事件都会被触发两次。我怎样才能防止它发射两次。在相同线性布局的点击事件上,线性布局 onclick 事件将在第二次点击时触发,而不是在第一次点击时触发。我不明白我哪里出错了。请帮忙。

-- XML

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:orientation="vertical" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:weightSum="1.0" >

            <LinearLayout
                android:id="@+id/layout_button_sub"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/Home.Item.Spacing.Vertical"
                android:layout_marginLeft="@dimen/Home.Item.Spacing.Horizontal"
                android:layout_marginRight="@dimen/Home.Item.Spacing.Horizontal"
                android:layout_marginTop="@dimen/Home.Item.Spacing.Vertical"
                android:layout_weight="0.5"
                android:background="@drawable/bg_home_item"
                android:clickable="true"
                android:descendantFocusability="blocksDescendants"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:inputType="none" >

                    <ImageView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:duplicateParentState="false"
                        android:focusableInTouchMode="false"
                        android:src="@drawable/ic_subs" />

                    <TextView
                        android:layout_width="fill_parent"
                        android:layout_height="wrap_content"
                        android:duplicateParentState="false"
                        android:focusableInTouchMode="false"
                        android:gravity="right"
                        android:inputType="none"
                        android:text="Subscriptions"
                        android:textColor="@color/White"
                        android:textSize="@dimen/Normal.Text.Size" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/layout_button_find"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/Home.Item.Spacing.Vertical"
                android:layout_marginLeft="@dimen/Home.Item.Spacing.Horizontal"
                android:layout_marginRight="@dimen/Home.Item.Spacing.Horizontal"
                android:layout_marginTop="@dimen/Home.Item.Spacing.Vertical"
                android:layout_weight="0.5"
                android:background="@drawable/bg_home_item"
                android:clickable="true"
                android:descendantFocusability="blocksDescendants"
                android:focusable="true"
                android:focusableInTouchMode="true"
                android:inputType="none">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:duplicateParentState="false"
                    android:focusableInTouchMode="false"
                    android:src="@drawable/ic_find" />

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:duplicateParentState="false"
                    android:focusableInTouchMode="false"
                    android:gravity="right"
                    android:inputType="none"
                    android:text="Find Nearby"
                    android:textColor="@color/White"
                    android:textSize="@dimen/Normal.Text.Size" />
            </LinearLayout>
        </LinearLayout>
    </LinearLayout>
</ScrollView>

-- Oncreate 方法上的活动

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.layout_main);
    linearLayoutSubs = (LinearLayout)findViewById(R.id.layout_button_sub);
    linearLayoutFind = (LinearLayout)findViewById(R.id.layout_button_find);

    linearLayoutSubs.setOnTouchListener(new mOnTouchListener());
    linearLayoutFind.setOnTouchListener(new mOnTouchListener());
}

-- onTouch 监听器

public class  mOnTouchListener implements OnTouchListener {
    Intent intent = null;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch(v.getId()) {
            case R.id.layout_button_subscriptions:
                intent = new Intent(AppActivity.this, Subs.class);//class for navigation
                break;
            case R.id.layout_button_find_nearby:
                intent = new Intent(AppActivity.this, Find.class);//class for navigation
                break;
        }

        if(intent != null) {
            startActivity(intent);
        }
        return true;
    }
}
4

3 回答 3

2

首先,从您的布局 xml 中删除android:focusable="true"和删除。这可以防止焦点更改消耗第一个触摸/单击事件。android:focusableInTouchMode="true"layout_button_sublayout_button_find

然后,将您的更改OnTouchListenerOnClickListener

private class mOnClickListener implements OnClickListener
{
    Intent intent;

    public void onClick(View v)
    {
       switch (v.getId()) 
       {
           case R.id.layout_button_sub: 
                intent = new Intent(AppActivity.this, Subs.class);
                break;
           case R.id.layout_button_find: 
                intent = new Intent(AppActivity.this, Find.class);
                break; 
        }

        if (intent != null) 
        {
            startActivity(intent); 
        } 
    }       
}

并为您的 LinearLayouts 设置它:

mOnClickListener listener = new mOnClickListener();
linearLayoutSubs.setOnClickListener(listener);
linearLayoutFind.setOnClickListener(listener);

onTouch()事件会在多个 MotionEvents: ACTION_DOWNACTION_MOVE等上触发。每次您使用 来“单击”时OnTouchListener,该方法至少会触发一次,一次是您放下手指,一次是抬起手指。由于您的原始onTouch()方法没有考虑不同的操作,startActivity()因此每次触摸事件都会被调用。

于 2013-10-18T09:50:49.243 回答
0

我想问题是因为你没有为触摸定义动作 MOVE、UP 和 DOWN。尝试在MotionEvent.ACTION_DOWN中编写您的代码,如果这对您有用。

    case R.id.layout_button_subscriptions:{   
      switch (event.getAction()) {
                        case MotionEvent.ACTION_MOVE: 
                              {

                                 break;
                              }
                        case MotionEvent.ACTION_DOWN: {

                            startActivity(new Intent(AppActivity.this,Subs.class));
                        break;
                    }
    }
于 2013-10-18T05:41:32.083 回答
0

我可以看到的代码中的第一个错误是您设置了两次触摸侦听器,而不是执行以下操作

mOnTouchListener listener =  new mOnTouchListener();
linearLayoutSubs.setOnTouchListener(listener);
linearLayoutFind.setOnTouchListener(listener);

如果可能,请在 onTouch 中使用 if else 条件,并且每当 onTouch 发生时,仅从该位置返回 true。

因为很多时候它没有从那个位置返回,因此事件被触发了两次。

于 2013-10-18T05:57:09.653 回答