我有一個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)'時出現同樣的問題。 –
您是否設法找到解決方案? –