Android SeekBarChangeListener и TouchListener Нет событий
У меня проблема с событиями нажатия кнопок и событиями поиска, которые не срабатывают. Когда я перетаскиваю свой поисковый барьер, слайдер меняет положение визуально, но в моем OnSeekBarChangedListener
нет события. У меня также есть ImageButton
, который должен получать события click, но он не срабатывает. MyView внизу обрабатывает события касания должным образом. Он содержит GLSurfaceView
, что я могу перемещаться и увеличивать масштаб. Что может привести к тому, что события не будут срабатывать?
Здесь мой макет:
<?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>
И вот слушатели:
@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);
}
Ответы
Ответ 1
попробуйте это, замените LinearLayout на FrameLayout, это не лучше всего работает, но работает хорошо
<?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>
Ответ 2
Попробуйте изменить свой код на это:
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
Можно ли это воспроизвести, удалив GLSurfaceView?
Если это так, изменение SurfaceView.setZOrderOnTop
может помочь.
http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderOnTop(boolean)
Ответ 4
может возникнуть проблема дизайна макета, поэтому, пожалуйста, перестройте компоненты ui.
seekbar находится над imagebutton, поэтому платформа Android не может обнаружить событие касания.
установить layout_below в строке поиска
Ответ 5
Одной из возможных причин этого может быть сенсорная обработка в пользовательском MyView. Мы должны быть очень осторожны относительно возвращаемого значения функции onTouchEvent(). Попробуйте вернуть "true" из вашего onTouchEvent(), если вы потребляете событие else, возвращаете "false".