2016-11-27 86 views
2

我有一个ListView的子视图有长按听众设置。当长时间点击子视图时,会显示一个对话框。为什么在对话框显示时不会触摸事件?

的问题是,如果用户保持对话节目后,他们的手指按下那么他们仍然可以滚动的ListView,即使ListView控件现在是对话的后面。经过调试,我发现,所有的触摸事件(例如,ACTION_MOVEACTION_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控件仍然是滚动甚至在对话获得焦点,如果用户不会放手孩子的看法。这似乎只在对话框第一次显示时发生(直到再次创建活动)。

我有两个问题:

  1. 这是一个Android的bug?发生了什么事是,触摸手势运行完成(从ACTION_DOWNACTION_UP),即使窗口失去ACTION_UP以前集中。我无法想象这永远是可取的行为。

  2. 这里有什么最好的解决办法?下面的解决方案(忽略所有的触摸事件窗口失去焦点后)的作品,但我不知道是否有更好的东西:

    public class MainActivity extends Activity { 
        ... 
    
        @Override 
        public void dispatchTouchEvent(MotionEvent event) { 
         if (hasWindowFocus()) { 
          return super.dispatchTouchEvent(event); 
         } else { 
          return true; // suppress 
         } 
        } 
    } 
    

    请注意,我不能使用AbsListView.setOnItemLongClickListener,它忽略后,所有触摸事件,解决了这个问题已经检测到长时间点击,因为它太不灵活了。

+0

尝试调用'setCancelable(假)'在'AlertDialog .Builder'实例。 – Emmanuel

+0

@Emmanuel使用'setCancelable(false)'时出现同样的问题。 –

+0

您是否设法找到解决方案? –

回答

0

我不知道事件的方式在Android上工作。 在我看来,当你点击屏幕,根据你的坐标,android会指定查看这个事件的过程。因为用户还没有发布滚动视图事件,所以这个视图仍然被理解为正在处理这个事件。

告诉你对话之前就解决listView.setEnable(真)。

最佳实践,创建自定义对话框或util的创建与听众对话:

前戏 - >禁用的ListView 解雇前 - >启用的ListView