触摸事件为lienar布局弹出多个屏幕。似乎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;
}
}
答案 0 :(得分:2)
首先,从布局xml中的android:focusable="true"
和android:focusableInTouchMode="true"
中删除layout_button_sub
和layout_button_find
。
这可以防止第一次触摸/点击事件被焦点更改消耗。
然后,将您的OnTouchListener
更改为OnClickListener
:
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()
事件触发了几个MotionEvent:ACTION_DOWN
,ACTION_MOVE
等。每次使用OnTouchListener
“点击”时,该方法至少会触发,一旦你把手指放下,一次当你举起手指。由于您的原始onTouch()
方法未考虑不同的操作,因此每次触摸事件都会调用startActivity()
。
答案 1 :(得分: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;
}
}
答案 2 :(得分:0)
我可以看到的代码中的第一个错误是你在触摸监听器上设置两次,而不是执行以下操作
mOnTouchListener listener = new mOnTouchListener();
linearLayoutSubs.setOnTouchListener(listener);
linearLayoutFind.setOnTouchListener(listener);
如果可能的话,在onTouch中使用if else条件,并且只要onTouch发生,只从该位置返回true。
因为很多次它没有从该位置返回,因此事件被触发两次。