2013-03-26 33 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

相關問題