Android 长按EditText时弹出窗口未触发系统上下文对话框
对不起,如果标题有点模糊 我正在自由职业者上开发一个应用程序,我几乎完成了它,除了一些测试后客户的投诉 我使用弹出窗口代替对话框来编辑上下文设置(如果有意义的话)。我不想说得太具体,冒着泄露应用程序概念的风险,我相信客户不会太满意 PopupWindow提供了一个从XML膨胀的布局的内容视图。在该布局中有几个EditText小部件。问题在于,这些编辑文本不会触发长按时的默认上下文对话框,该对话框显示文本/输入法选择和剪切/复制/粘贴选项 我看到了一个类似的问题,试图获得TouchTrigger或其他东西,但如果没有挫折感,它就无法工作,我已经尝试了一个简单的新ColorDrawable()。它仍然不起作用 在OnLongPressListener中,是否有任何简单的方法可以触发系统默认的长按对话框,或者我是否需要移动天地来实现它?因为如果是这样的话,我只需要为它写一个片段,然后在事务中交换它。我知道那会有用的 有关守则: 在起始碎片内:Android 长按EditText时弹出窗口未触发系统上下文对话框,android,popup,window,android-edittext,Android,Popup,Window,Android Edittext,对不起,如果标题有点模糊 我正在自由职业者上开发一个应用程序,我几乎完成了它,除了一些测试后客户的投诉 我使用弹出窗口代替对话框来编辑上下文设置(如果有意义的话)。我不想说得太具体,冒着泄露应用程序概念的风险,我相信客户不会太满意 PopupWindow提供了一个从XML膨胀的布局的内容视图。在该布局中有几个EditText小部件。问题在于,这些编辑文本不会触发长按时的默认上下文对话框,该对话框显示文本/输入法选择和剪切/复制/粘贴选项 我看到了一个类似的问题,试图获得TouchTrigger或
RulesDialog dialog;
PopupWindow window;
public void showAddRuleDialog(){
dialog = new RulesDialog();
View view = getView();
window = new PopupWindow(dialog.initViews(this, null), view.getWidth(), view.getHeight(), true);
window.setBackgroundDrawable(new ColorDrawable());
dialog.setRulesDialogListener(new rulesDialogListener(){
@Override
public void onSave(ViewHolder holder) {
addRule(holder);
window.dismiss();
}
@Override
public void onCancel() {
window.dismiss();
}});
int[] location = {0,0};
view.getLocationOnScreen(location);
window.showAtLocation(view, 0, location[0], location[1]);
在规则对话框中:
public class ViewHolder{
public ViewHolder(View dialogView){
name = (TextView) dialogView.findViewById(R.id.name);
response = (TextView) dialogView.findViewById(R.id.response);
senders = (TextView) dialogView.findViewById(R.id.senders);
sendersAdd = (Button) dialogView.findViewById(R.id.sendersAdd);
sendersEdit = (Button) dialogView.findViewById(R.id.sendersEdit);
timeFrom = (TextView) dialogView.findViewById(R.id.from);
timeFromEdit = (Button) dialogView.findViewById(R.id.timeBeforeEdit);
timeTo = (TextView) dialogView.findViewById(R.id.to);
timeToEdit = (Button) dialogView.findViewById(R.id.timeAfterEdit);
keywords = (TextView) dialogView.findViewById(R.id.keywords);
matchCase = (CheckBox) dialogView.findViewById(R.id.matchCase);
matchAlone = (CheckBox) dialogView.findViewById(R.id.matchAlone);
matchPlural = (CheckBox) dialogView.findViewById(R.id.matchPlural);
cancel = (Button) dialogView.findViewById(R.id.cancel);
save = (Button) dialogView.findViewById(R.id.save);
}
TextView name;
TextView response;
TextView senders;
Button sendersAdd;
Button sendersEdit;
TextView timeFrom;
Button timeFromEdit;
TextView timeTo;
Button timeToEdit;
TextView keywords;
CheckBox matchCase;
CheckBox matchAlone;
CheckBox matchPlural;
Button cancel;
Button save;
}
Activity activity;
ViewHolder holder;
Fragment fragment;
public View initViews(Fragment mFragment, Rule rule){
fragment = mFragment;
activity = fragment.getActivity();
View dialogView = LayoutInflater.from(activity).inflate(R.layout.rules_dialog, null);
holder = new ViewHolder(dialogView);
final TextView senders = holder.senders;
holder.sendersAdd.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
showContacts();
}});
holder.sendersEdit.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
editSenders(senders);
}
});
final TextView timeFrom = holder.timeFrom;
holder.timeFromEdit.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
showTimePickerDialog(timeFrom);
}
});
final TextView timeTo = holder.timeTo;
holder.timeToEdit.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
showTimePickerDialog(timeTo);
}
});
holder.cancel.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mListener.onCancel();
}});
holder.save.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mListener.onSave(holder);
}});
if(rule == null)
rule = new Rule();
holder.name.setText(rule.name);
holder.response.setText(rule.response);
holder.senders.setText(rule.senders.toString());
holder.senders.setTag(rule.senders);
holder.keywords.setText(rule.keywords);
holder.matchCase.setChecked(rule.matchCase);
holder.matchAlone.setChecked(rule.matchAlone);
holder.matchPlural.setChecked(rule.matchPlural);
holder.timeFrom.setTag(rule.timeFrom);
holder.timeFrom.setText(Rules.formatTime(rule.timeFrom));
holder.timeTo.setTag(rule.timeTo);
holder.timeTo.setText(Rules.formatTime(rule.timeTo));
return dialogView;
}
所以我试着将RulesDialog作为一个片段重写,但效果不太好。当从正在操作的片段调用时,在使片段事务正常工作方面存在问题 (我知道这不是碎片的重点。我现在并不是真的打算编写一个完全模块化的应用程序。我只是想推出一款客户满意的产品。)
我最终将RulesDialog重写为一个活动,并使用调用片段中的startActivityForResult()。然后使用setResult()将编辑的数据传递回。这一切配合得很好。一切正常。唯一的问题是这些编辑文本不会在长按时触发上下文对话框。可能是因为我将它们转换为文本视图吗?不应该。