textpersonname - Android SeekBarChangeListener y TouchListener Sin eventos
outlined text fields android (5)
Tengo un problema con los eventos de clic de botón y los eventos de la barra de búsqueda no se activan. Cuando arrastro en mi barra de búsqueda, el control deslizante cambia de posición visualmente, pero no hay ningún evento que se OnSeekBarChangedListener
en mi OnSeekBarChangedListener
. También tengo un ImageButton
que debería recibir eventos de clic, pero tampoco se dispara. El MyView en la parte inferior aquí maneja los eventos táctiles correctamente. GLSurfaceView
un GLSurfaceView
que puedo desplazarme y pisar con zoom. ¿Qué podría estar causando que los eventos no se disparen?
Aquí está mi diseño:
<?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>
Y aquí están los oyentes:
@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);
}
¿Podría reproducirse esto eliminando GLSurfaceView?
Si es así, cambiar SurfaceView.setZOrderOnTop
podría ayudar. http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderOnTop(boolean)
Intenta cambiar tu código a esto:
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);
Una posible razón para esto podría ser el manejo táctil en MyView personalizado. Tenemos que tener mucho cuidado con el valor de retorno de la función onTouchEvent (). Intente devolver "true" desde su onTouchEvent () si está consumiendo el evento; de lo contrario, devuelva "false".
intente esto, reemplace LinearLayout con FrameLayout, no es el mejor desempeño pero funciona bien
<?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>
puede haber problemas con el diseño del diseño, así que reorganice los componentes de la interfaz de usuario. seekbar está sobre imagebutton, por lo que la plataforma Android no puede detectar eventos táctiles.
establecer layout_below en seekbar