2015-07-16 4 views
16

Ho riscontrato un problema con gli eventi di clic sui pulsanti e gli eventi Searchbar non attivati. Quando trascino la barra di ricerca, il cursore cambia visivamente posizione, ma nel mio OnSeekBarChangedListener non viene emesso alcun evento. Ho anche un ImageButton che dovrebbe ricevere eventi di clic, ma non spara neanche. Il MyView in basso qui gestisce correttamente gli eventi touch. Contiene uno GLSurfaceView che posso fare panoramiche e pizzicare con lo zoom. Che cosa potrebbe causare la mancata attivazione degli eventi?Android SeekBarChangeListener e TouchListener Nessun evento

Ecco il mio layout:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/tec_root"> 

    <ImageButton 
     android:id="@+id/button_star" 
     android:contentDescription="@string/star_description" 
     android:layout_width="32dp" 
     android:layout_height="32dp" 
     android:layout_marginTop="16dp" 
     android:layout_marginRight="16dp" 
     android:layout_marginEnd="16dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:src="@drawable/star_empty" 
     android:background="#00000000" 
     android:scaleType="fitXY"/> 

    <LinearLayout 
     android:id="@+id/view_plot" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@id/button_star"/> 

    <SeekBar 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_toLeftOf="@id/button_star" 
     android:layout_toStartOf="@id/button_star" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:progress="50" 
     android:layout_alignBaseline="@id/button_star" 
     android:id="@+id/seekbar" /> 

</RelativeLayout> 

e qui ci sono gli ascoltatori:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.my_activity); 

    prefs = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
    starred = prefs.getBoolean("starred", false); 

    final ImageButton starButton = (ImageButton) findViewById(R.id.button_star); 
    starButton.setImageDrawable(ContextCompat.getDrawable(this, (starred ? R.drawable.star_filled : 
      R.drawable.star_empty))); 

    starButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      starred = !starred; 

      prefsEditor = prefs.edit(); 
      prefsEditor.putBoolean("starred", starred); 
      prefsEditor.apply(); 

      starButton.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(), 
        (starred ? R.drawable.star_filled : R.drawable.star_empty))); 
     } 
    }); 

    ((SeekBar) findViewById(R.id.seekbar)).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      Log.e("TEST", "Seekbar onProgressChanged called"); 
      Toast.makeText(getApplicationContext(), "Seekbar fired", Toast.LENGTH_SHORT).show(); 
      // respond to update 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 

    MyView myView = new MyView(this, points, false); 
    ((LinearLayout) findViewById(R.id.view_plot)).addView(myView); 
} 
+0

È possibile ignorare onTouchEvent nella barra di ricerca e pubblicare il registro? Dalla documentazione e dal codice sorgente di SeekBar sembra che le viste a sinistra/destra che sono focalizzabili possano "rubare" gli eventi di tocco, risultando in un reDraw ma non in una notifica di aggiornamento dell'avanzamento. – JohanShogun

+0

Beh, ha iniziato a lavorare fuori dal nulla per qualche motivo. Ho cambiato un po 'la classe, ma non ricordo di aver cambiato nulla riguardo alla logica di quel 'SeekBar'. –

+0

Provare ad avviare la barra di ricerca prima di impostare Listener. –

risposta

0

provare a cambiare il codice per questo:

MyView myView = new MyView(this, points, false); 
    myView.setLayoutParams(new LinearLayout.LayoutParams(
             LinearLayout.LayoutParams.MATCH_PARENT, 
             LinearLayout.LayoutParams.MATCH_PARENT)); 
((LinearLayout) findViewById(R.id.view_plot)).addView(myView); 
3

provare questo, sostituire LinearLayout con FrameLayout, non è il migliore in perfomance ma funziona bene

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/tec_root" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" > 

      <SeekBar 
       android:id="@+id/seekbar" 
       android:layout_width="0dip" 
       android:layout_height="wrap_content" 
       android:background="#ABABAB" 
       android:layout_weight="1" 
       android:progress="50" /> 

      <ImageButton 
       android:id="@+id/button_star" 
       android:layout_width="32dp" 
       android:layout_height="32dp" 
       android:background="#00000000" 
       android:contentDescription="@string/star_description" 
       android:scaleType="fitXY" 
       android:src="@drawable/star_empty" /> 
     </LinearLayout> 

     <FrameLayout 
      android:id="@+id/view_plot" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="1"  
      /> 
</LinearLayout> 
0

potrebbe esserci un problema di progettazione del layout quindi riorganizzare i componenti di ui. La barra di ricerca è su imagebutton, quindi la piattaforma Android non è in grado di rilevare l'evento di tocco.

set layout_below in SeekBar

0

Una possibile ragione per questo potrebbe essere la gestione tocco in MyView personalizzato. Dobbiamo fare molta attenzione al valore di ritorno della funzione onTouchEvent(). Prova a restituire "true" dal tuo onTouchEvent() se stai consumando l'evento else restituisce "false".