2013-03-14 30 views
0

在創建自定義進度對話框片段時,我有點不解。一切工作正常,但因爲我不希望用戶「回去」,直到DialogFragment被解僱,我試圖捕獲KeyEvent和「禁用」。無法在onCreateView中禁用對話框片段的後退按鈕

雖然這個偉大的工程:

@Override 
public ProgressDialog onCreateDialog(Bundle savedInstanceState) { 

    final ProgressDialog dialog = new ProgressDialog(getActivity()); 
    dialog.setMessage(getString(R.string.loading_text)); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(false); 

    // Disable the back button 
    OnKeyListener keyListener = new OnKeyListener() { 

     @Override 
     public boolean onKey(DialogInterface dialog, int keyCode, 
       KeyEvent event) { 
      if(keyCode == KeyEvent.KEYCODE_BACK){ 
       return true; 
      } 
      return false; 
     } 
    }; 
    dialog.setOnKeyListener(keyListener); 
    return dialog; 
} 

使用onCreateDialog並不讓我正確,因此膨脹的片段,其定製我的片段的外觀&感覺。另一方面,onCreateDialog可完美地捕獲返回按鍵事件。當切換到onCreateView時:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //Inflate the XML view for the help dialog fragment 
    View view = inflater.inflate(R.layout.progress_dialog_fragment, container); 
    TextView text = (TextView)view.findViewById(R.id.loadingMessage); 
    text.setText(Html.fromHtml(getString(R.string.loading_text))); 

    // Disable the back button 
    android.view.View.OnKeyListener keyListener = new android.view.View.OnKeyListener() { 

     @Override 
     public boolean onKey(View view, int keyCode, KeyEvent event) { 
      if(keyCode == KeyEvent.KEYCODE_BACK){ 
       return true; 
      } 
       return false; 
     } 
    }; 
    view.setOnKeyListener(keyListener); 

    // request a window without the title 
    getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    //Transparent Dialog background 
    getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(0)); 
    return view; 
} 

事件沒有被捕獲。這導致我另一個問題......因爲我已經看到在許多SO問題中明顯使用onCreateDialog和onCreateView ......這兩者之間有什麼區別呢?

謝謝!

回答

4

onCreateDialog VS onCreateView

實現應該重寫這個類,並實現 onCreateView(LayoutInflater,ViewGroup中,包)提供對話框的內容 。或者,他們可以覆蓋onCreateDialog(Bundle) 以創建一個完全自定義的對話框,例如AlertDialog,其 自己的內容。

重要使用onCreateDialog時:

覆蓋建立自己的自定義對話框容器。這通常是 用於顯示AlertDialog而不是通用的Dialog;當做 所以,onCreateView(LayoutInflater,ViewGroup,Bundle)做不是需要執行 ,因爲AlertDialog處理它自己的內容。

Dialog(在這種情況下,AlertDialog):

public static class MyAlertDialogFragment extends DialogFragment { 

    public static MyAlertDialogFragment newInstance(int title) { 
     MyAlertDialogFragment frag = new MyAlertDialogFragment(); 
     Bundle args = new Bundle(); 
     args.putInt("title", title); 
     frag.setArguments(args); 
     return frag; 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     int title = getArguments().getInt("title"); 

     return new AlertDialog.Builder(getActivity()) 
       .setIcon(R.drawable.alert_dialog_icon) 
       .setTitle(title) 
       .setCanceble(false) 
       .setPositiveButton(R.string.alert_dialog_ok, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((FragmentAlertDialog)getActivity()).doPositiveClick(); 
         } 
        } 
       ) 
       .setNegativeButton(R.string.alert_dialog_cancel, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          ((FragmentAlertDialog)getActivity()).doNegativeClick(); 
         } 
        } 
       ) 
       .create(); 
    } 
} 

酒店setCanceble(boolean)狀態是否可以使用的背襯退出Dialog。無需在任何地方捕捉KEYCODE_BACK。

+0

你好Martjin,和什麼。從你的第一段我假設onCreateView是我需要的,而不是onCreateDialog ... – AlejandroVK 2013-03-14 15:16:00

+0

沒關係,我打電話setCancellable從活動,顯示對話框,感謝指出它Martijin!正確答案+ upvote :) – AlejandroVK 2013-03-14 15:27:13

+2

這不起作用。你必須在DialogFragment上調用'setCancelable(boolean)',而不是在'Dialog'上調用,這正是你現在正在做的。 – Daniel 2014-03-24 18:03:05

6
DialogFragment newFragment = YourFragment.newInstance(); 
       newFragment.setCancelable(false); 
       newFragment.show(fragmentTransaction, "dialog"); 

添加setCancelable(假的),你.Show()之前約時創建的,而不是對話視圖做同樣的片段

+0

偉大的提示。這是http://stackoverflow.com/a/16480564/294884上的一個重要的進一步觀點 – Fattie 2014-06-05 08:19:50