Android的SeekBarChangeListener和TouchListener没有事件

我遇到button点击事件和seekbar事件不能触发的问题。 当我拖动我的search栏时,滑块可视地改变位置,但是在OnSeekBarChangedListener没有事件被触发。 我也有一个ImageButton应该接收点击事件,但它也不会触发。 这里底部的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); } 

Solutions Collecting From Web of "Android的SeekBarChangeListener和TouchListener没有事件"

试试这个,使用FrameLayoutreplaceLinearLayout,在性能上不是最好的,但是效果很好

 <?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> 

尝试将您的代码更改为:

 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); 

这可以通过删除GLSurfaceView来复制?

如果是这样,更改SurfaceView.setZOrderOnTop可能会有所帮助。 http://developer.android.com/reference/android/view/SurfaceView.html#setZOrderOnTop(boolean&#xFF09;

可能会有布局devise问题,请重新排列UI的组件。 seekbar超过imagebutton,所以android平台无法检测到触摸事件。

在seekbar中设置layout_below

一个可能的原因可能是自定义MyView中的触摸处理。 我们必须非常小心onTouchEvent()函数的返回值。 尝试从onTouchEvent()返回“true”,如果您正在使用事件,则返回“false”。