2015-09-22 96 views
1

我有ReltiveLayout與ImageView和TextView裏面。onTouch和onClick沒有正確觸發

所以,我有兩個事件偵聽器:

  • onClick
  • onTouch

我使用9patch的圖像。當我使用onTouch事件時,onClick完全沒有觸發,onTouch也不能很好地工作。如果我禁用onTouch並離開onClick它會觸發並更改活動。我想讓onTouch和onClick一起工作。我想:

  • 當RelativeLayout的點擊則顯示所選按鈕的ImageView
  • 否則顯示正常按鈕的ImageView
  • onClickListener變更活動。

繼承人我的代碼:

StartBtn = (RelativeLayout) findViewById(R.id.StartBtn); 
StartBtnImage = (ImageView) findViewById(R.id.StartBtnImage); 
StartBtnText = (TextView) findViewById(R.id.StartBtnText); 

StartBtn.setOnTouchListener(new TouchButton(StartBtnImage)); //Commenting this line makes the onClickListener work 
StartBtn.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     StartBtnImage.setImageResource(R.drawable.btn_selected); 
     Log.d("ButtonClick", "Done"); 
     Intent myIntent = new Intent(MainMenu.this, Game.class); 
     startActivity(myIntent); 

    } 
}); 

而我TouchButton類:

public class TouchButton implements View.OnTouchListener { 

    ImageView IV; 

    public TouchButton(ImageView Image) { 
     IV = Image; 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       IV.setImageResource(R.drawable.btn_selected); 
       return true; 
      case MotionEvent.ACTION_UP: 
      case MotionEvent.ACTION_OUTSIDE: 
      default: 
       IV.setImageResource(R.drawable.btn); 
       return false; 
     } 
    } 
} 

這裏是我的佈局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainMenu"> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/MainMenuBg" 
    android:background="@drawable/main_menu_bg" /> 

<RelativeLayout 
    android:layout_width="250dp" 
    android:layout_height="75dp" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="130dp" 
    android:id="@+id/StartBtn" 
    android:clickable="true"> 

    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/StartBtnImage" 
     android:src="@drawable/btn" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:text="Start" 
     android:id="@+id/StartBtnText" 
     android:layout_centerVertical="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:singleLine="false" 
     android:gravity="center|center_vertical|center_horizontal" 
     android:textSize="50dp" /> 
</RelativeLayout> 

我知道我在解釋不好,所以這裏是一個視頻:https://www.youtube.com/watch?v=PtdUsW-Dnqk

+0

嘗試編寫自己的按鈕選擇器(XML可繪製文件)。 –

+0

我不知道該怎麼做。我正在按照教程做所有事情,但它在我的設備上的工作方式不同。 –

+0

[示例](http://www.mkyong.com/android/android-imagebutton-selector-example/) –

回答

2

UPDATE:因爲你不能在一個單一的視圖see link使用多個監聽器。 你可以在你的TouchButton.class中實現你的.setOnClickListener的行爲。

public class TouchButton implements View.OnTouchListener { 

ImageView IV; 

public TouchButton(ImageView Image) { 
    IV = Image; 
} 

public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      IV.setImageResource(R.drawable.btn_selected); 
      return true; 
     case MotionEvent.ACTION_UP: 
      switch(v.getId()){ 
       case R.id.StartBtn: 
        IV.setImageResource(R.drawable.btn_selected); 
        Log.d("ButtonClick", "Done"); 
        Intent myIntent = new Intent(MainMenu.this, Game.class); 
        startActivity(myIntent); 
        break; 
      return true; 
     case MotionEvent.ACTION_OUTSIDE: 
     default: 
      IV.setImageResource(R.drawable.btn); 
      return false; 
    } 
    } 
} 
+0

並不是每個按鈕都會改變活動,但每個按鈕都有這個動畫。這就是爲什麼我要分開做。 –

+0

不幸的是,你不能在一個視圖上使用多個監聽器請參閱:[鏈接](http://stackoverflow.com/a/4542650/2204265) 您可以轉發該事件。 – reebow

2

是的,你可以在一個視圖上使用多個偵聽器(如果這是不可能的,它會有問題)。

基本上,您的視圖的觸摸事件觸發之前點擊事件。 如果觸摸偵聽器消耗事件(從onTouch返回true),則不會調用點擊偵聽器。 如果您從onTouch偵聽器返回true,那麼您的不會消耗事件(返回false),並且任何基礎偵聽器都將像onClick偵聽器一樣調用。

這裏連接到單個視圖兩個監聽器(按鈕)的一個例子:

btnStart = (Button) findViewById(R.id.btn_start); 

    btnStart.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      Log.d("stack", "TOUCH EVENT"); 
      return false; 
     } 
    }); 

    btnStart.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("stack", "CLICK EVENT"); 
      Toast.makeText(getApplicationContext(), "start game...", Toast.LENGTH_LONG).show(); 
     } 
    }); 

和佈局,一個簡單的按鈕:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

<Button 
    android:id="@+id/btn_start" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="start btn"/> 
</RelativeLayout> 

在日誌你會看到觸摸事件在點擊按鈕之前寫入,因爲onTouch偵聽器不會使用該事件(返回false)並首先被調用。

我建議你閱讀有關Android中觸摸傳播的文檔,並在Dave Smith的這個主題上檢查這個有用的video

最後你應該看看小窗口狀態在XML改變他們的apparence當他們獲得點擊,或專注,......看一看there

希望這將有助於。

+0

這允許自定義onTouch處理,而無需刪除onClick背景更改(例如紋波效應)。偉大的貢獻,謝謝! –