2013-03-26 66 views
1

我只需要处理TextView的长按事件(并在此事件上显示popup菜单)。但在简单点击的情况下,我应该将此事件转移到托管此视图的布局。如何不在同一时间处理View.onClick()并处理View.onLongClick()?

如何实现这一目标?

public class MainActivity extends Activity implements OnLongClickListener, OnClickListener { 

TextView mTextView; 
RelativeLayout mTopLayout; 

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

    mTextView = (TextView) findViewById(R.id.mTextView); 
    mTopLayout = (RelativeLayout) findViewById(R.id.mTopLayout); 

    mTextView.setOnLongClickListener(this); 
    mTopLayout.setOnClickListener(this); 
    mTextView.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    Toast.makeText(this, v.getClass().getName() + " clicked!", Toast.LENGTH_SHORT).show(); 
    if (v.getId() == R.id.mTextView) { 
     ((View) v.getParent()).performClick(); 
    } 
} 

... 
} 

这样我们就会收到两个连续的点击事件,并且在android中会有两个标准的点击声音。不好。

是否有一些简单的方法来实现这一目标?

这里是XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/mTopLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <TextView 
     android:id="@+id/mTextView" 
     android:layout_width="match_parent" 
     android:layout_height="200dp" 
     android:background="#FFFF0000" 
     android:clickable="false" 
     android:focusable="false" 
     android:text="@string/hello_world" /> 

</RelativeLayout> 

编辑: 我想补充细节。如果我不会设置onClickListener,那么在TextView中进行截图没有任何效果,并且此事件被mTextView消耗(即使可点击和可聚焦在xml中设置为false)并且不会传递给mTopLayout

+0

可能是GestureDetecter在这里有帮助吗? – Prizoff 2013-03-26 13:25:20

+0

我正在做类似的事情! http://stackoverflow.com/questions/16621070/get-context-of-popupmenu-like-contextmenu – toobsco42 2013-05-18 16:07:19

回答

0

最后...

为什么在所有的我需要使onClickListeners使用不同的处理程序?笨。

@Override 
public void onClick(View v) { 
    Toast.makeText(this, v.getClass().getName() + " clicked!", Toast.LENGTH_SHORT).show(); 
    if (v.getId() == R.id.mTextView || v.getId() == R.id.mTopLayout) { 
     //do whatever I need 
    } 
} 

真的很简单。

1

我不清楚只想点击,但android只捕捉一次只有一个点击列表器onClick或onLongClick。

+0

点击只会在背景布局上进行,并会执行一些其他操作,与TextView无关。所以,简单的点击应该是这样的,因为根本没有这个TextView,只有长时间点击才能打开上下文菜单,将其内容复制到剪贴板 - 这是所有这些东西的背景。 – Prizoff 2013-03-26 13:27:24

+0

刚刚检查过,Android在同一个View上同时处理onClick()和onLongClick()。 – Prizoff 2013-03-26 13:50:43

1

添加单独的侦听器..

mTextView.setOnLongClickListener(new OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      // do something; 
     } 
    }); 

mTextView.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // do something 

     } 
    }); 
+0

在这种情况下,Android会考虑处理mTextView的onClickListener中的onClickEvent,并发出点击声音 - 这是不好的 – Prizoff 2013-03-26 13:24:29

0

我刚刚创建了一个示范项目。同样的问题OnLongClick它被烧成的OnClick 也 但是当我的setOnLongClickListener返回值改为false 它开始单独管理这些点击。

mbuttton = (Button)findViewById(R.id.View1); 

     mbuttton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(getBaseContext(), "single click", Toast.LENGTH_LONG).show(); 
       Log.i("Single Click", "Single click"); 
      } 
     }); 

     mbuttton.setOnLongClickListener(new OnLongClickListener() { 

      @Override 
      public boolean onLongClick(View v) { 
       // TODO Auto-generated method stub    
       Toast.makeText(getBaseContext(), "LONG click", Toast.LENGTH_LONG).show(); 
       Log.i("Long Click", "Long click"); 
       return true; 
      } 
     }); 

我做了这一点,但如果你所要求的解释oooohhh我几乎放弃的话,不知道如何将这些返回值管理

+0

onLongClickListener返回true。这个问题简而言之就是Link :)如何告诉Android,我根本不需要它? :) – Prizoff 2013-03-26 13:31:33

+0

这会给什么? onLongClickListener()在短时间内不会被调用。 – Prizoff 2013-03-26 13:35:45

+0

我做到了,但如果你要求解释oooohhh我几乎放弃,那么不知道这些返回值是如何管理的。 返回false实际上使它发生更新我的答案(包含我刚刚创建的演示应用程序来检查它) – DeltaCap 2013-03-26 14:01:44