2012-11-06 79 views
1

对不起,如果标题有点模糊。PopupWindow不能触发EditText上的系统上下文对话框长按

我正在开发一个自由职业者的应用程序,除了经过一些测试之后来自客户的投诉,我几乎完成了它。

我使用PopupWindow来代替编辑上下文设置的对话框,如果这样做有任何意义。我不想过于具体,并且冒险将应用程序概念带走,我相信客户不会太高兴。

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

我看到一个类似的问题,试图获取TouchTrigger或其他东西,它不工作没有setBackgroundDrawable(),我尝试了一个简单的新ColorDrawable()。它仍然不起作用。

是否有任何简单的方法来触发OnLongPressListener中的系统默认长按对话框,还是我必须移动Heaven和Earth来自己实现它?因为如果是这样的话,我会为它写一个片段并在交易中交换出来。我知道这会起作用。

相关的代码: 引发片段内:

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]); 

在RulesDialog:

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

请显示您的代码 –

+0

它一切正常。唯一的问题是那些EditTexts不会长时间触发上下文对话框。 –

+0

难道是因为我将它们投射到TextViews?不应该。 –

回答

0

于是,我就重写RulesDialog作为一个片段,它没有工作了太清楚了。在从他们正在操作的片段调用时,使得片段事务工作正常。 (我知道这不是一个片段,我不是真的打算写一个完全模块化的应用程序,我只是想要一个客户会满意的产品。)

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

相关问题