我有一个ListView的子视图有长按听众设置。当长时间点击子视图时,会显示一个对话框。为什么在对话框显示时不会触摸事件?
的问题是,如果用户保持对话节目后,他们的手指按下那么他们仍然可以滚动的ListView,即使ListView控件现在是对话的后面。经过调试,我发现,所有的触摸事件(例如,ACTION_MOVE
和ACTION_UP
)都仍然在原来的窗口中接收,直到用户终于抬起他们的手指。
这里是一个简短的重复的例子:
package foo;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView listView = new ListView(this);
listView.setAdapter(new FooAdapter());
setContentView(listView);
}
}
class FooAdapter extends BaseAdapter {
@Override
public int getCount() {
return 100;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Context context = parent.getContext();
TextView textView = new TextView(context);
textView.setText("Text");
textView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
new AlertDialog.Builder(context)
.setMessage("Hi")
.show();
return true;
}
});
return textView;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
}
在Android 6.0,7.0,7.1,ListView控件仍然是滚动甚至在对话获得焦点,如果用户不会放手孩子的看法。这似乎只在对话框第一次显示时发生(直到再次创建活动)。
我有两个问题:
这是一个Android的bug?发生了什么事是,触摸手势运行完成(从
ACTION_DOWN
到ACTION_UP
),即使窗口失去ACTION_UP
以前集中。我无法想象这永远是可取的行为。这里有什么最好的解决办法?下面的解决方案(忽略所有的触摸事件窗口失去焦点后)的作品,但我不知道是否有更好的东西:
public class MainActivity extends Activity { ... @Override public void dispatchTouchEvent(MotionEvent event) { if (hasWindowFocus()) { return super.dispatchTouchEvent(event); } else { return true; // suppress } } }
请注意,我不能使用
AbsListView.setOnItemLongClickListener
,它忽略后,所有触摸事件,解决了这个问题已经检测到长时间点击,因为它太不灵活了。
尝试调用'setCancelable(假)'在'AlertDialog .Builder'实例。 – Emmanuel
@Emmanuel使用'setCancelable(false)'时出现同样的问题。 –
您是否设法找到解决方案? –