2015-09-22 2 views
1

У меня есть ReltiveLayout с ImageView и TextView внутри.onTouch и onClick не запускаются правильно

Так у меня есть два слушателя событий:

  • onClick
  • onTouch

Я использую 9patch для изображения. Когда я использую событие onTouch, onClick не стреляет вообще, а также onTouch не работает очень хорошо. Если отключить onTouch и оставить onClick, он срабатывает и изменяет Activity. Я хочу сделать onTouch и onClick работать вместе. Я хочу:

  • Когда RelativeLayout нажатия она показывает выбранную кнопку ImageView
  • В противном случае вывести нормальную кнопку ImageView
  • onClickListener изменения активности.

Heres мой код:

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. Вы можете реализовать поведение вашего .setOnClickListener в своем TouchButton.class.

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

К сожалению, вы не можете использовать несколько прослушивателей на одном Вид: [link] (http://stackoverflow.com/a/4542650/2204265) Вы можете переслать мероприятие. – reebow

2

Да, вы можете использовать несколько слушателей на одном экране (если это было невозможно, это было бы проблематично).

В принципе, событие касания вашего вида запускается до click event. Если прослушиватель прикосновений расходует событие (, возвращающее true с onTouch), то прослушиватель кликов не будет вызываться. Если вы вернете истину из прослушивателя onTouch, то вы не будете принимать событие (, возвращающее 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> 

В журнале вы увидите СЕНСОРНУЮ EVENT написанное до CLICK EVENT, когда вы касаетесь кнопки, потому что прослушиватель onTouch не использует событие (возвращает false) и сначала вызывается.

Предлагаю вам прочитать документ о распространении касания в Android и проверить этот полезный video по этому вопросу от Дэйва Смита.

Наконец Вы должны взглянуть на виджете состояниях в XML для изменения apparence из них, когда они получают щелкнули, или целенаправленные, ... Взгляните there

Надеется, что это поможет.

+0

Это позволяет настраивать обработку onTouch без удаления фонового изменения onClick (например, эффекта пульсации). Большой вклад, спасибо! –

Смежные вопросы