【问题标题】:PopupWindow not triggering sytem context dialog on EditText long-pressPopupWindow 不会在 EditText 长按上触发系统上下文对话框
【发布时间】:2012-11-06 09:58:56
【问题描述】:

对不起,如果标题有点模糊。

我正在 Freelancer 上开发一个应用程序,我几乎完成了它,除了一些测试后客户的投诉。

如果有意义的话,我会使用 PopupWindow 代替对话框来编辑上下文设置。我不想过于具体并冒着泄露应用概念的风险,我相信客户不会对此感到太高兴。

PopupWindow 被赋予了一个从 XML 扩展而来的布局的内容视图。在该布局中有几个 EditText 小部件。问题是那些 EditTexts 不会在长按时触发默认的上下文对话框,该对话框提供文本/IME 选择和剪切/复制/粘贴选项。

我看到了一个类似的问题,试图获取 TouchTrigger 或其他东西,但如果没有 setBackgroundDrawable(),它就无法工作,我已经尝试使用简单的 new ColorDrawable()。还是不行。

有没有什么简单的方法可以在 OnLongPressListener 中触发系统默认的长按对话框,或者我必须自己移动天堂和地球来实现它?因为如果是这样的话,我会为它写一个 Fragment 并在事务中交换它。我知道这会奏效。

相关代码: 在启动片段内部:

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

【问题讨论】:

  • 一切正常。唯一的问题是那些 EditTexts 不会在长按时触发上下文对话框。
  • 可能是因为我将它们转换为 TextViews 吗?不应该。

标签: android popup window android-edittext


【解决方案1】:

所以我尝试将 RulesDialog 重写为一个片段,但效果并不好。当从它们正在操作的 Fragment 调用时,使 Fragment Transactions 正常工作时遇到问题。

(我知道这不是碎片化的重点。我现在并不是真的打算编写一个完全模块化的应用程序。我只是想推出一款客户会满意的产品。)

我最终将 RulesDialog 重写为 Activity,并使用调用片段中的 startActivityForResult()。然后使用 setResult() 将编辑后的数据传回。这一切都很好地协同工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多