2012-11-06 23 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()。這一切都很好地協調一致。

相關問題