2016-02-29 63 views
3

我目前正在嘗試構建一個簡單的設置片段警報框。與片段警報框的故障

我已經構建了警告框的主體,但是我注意到實際的Dialog方法沒有使用。此外,該對話框方法取代了onCreate()方法。

我該如何實際使用Dialog方法?在創建對話框方法後,我似乎無法簡單地調用它,因爲它出現錯誤。

我必須在某些XML中引用它嗎? 如果是這樣,那麼哪個XML - Fragment的XML或其父Activity的XML?

以下是我的Dialog Fragment的代碼。我還沒有修改它的XML。

import android.app.AlertDialog; 
import android.app.Dialog; 
import android.app.Fragment; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 

public class ExceedingLimitFragment extends Fragment { 

    public Dialog onCreateDialogExceed (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setTitle(R.string.exceeding_limit_title); 
     builder.setMessage(R.string.exceeding_limit_message); 
     builder.setPositiveButton(R.string.exceeding_limit_positive, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Intent ExceedingLimitPositiveIntent = new Intent (ExceedingLimitFragment.this.getActivity(), SettingsMenu.class); 
       startActivity(ExceedingLimitPositiveIntent); 
      } 
     }); 
     builder.setNegativeButton(R.string.exceeding_limit_negative, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       dialog.cancel(); 
      } 
     }); 

     return builder.create(); 
    } 

} 

回答

1

我注意到上述代碼的一些問題。 拳頭:

public Dialog onCreateDialogExceed (Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

看起來不對。您應該只是調用您正在覆蓋的方法的super方法。在這種情況下,onCreateDialogExceed是您自己的方法,因此您應該致電onCreate()。系統依賴於你在覆蓋它們之後立即調用這些方法,以便它知道它們以正確的順序被調用。

請問ExceedingLimitFragment需要顯示DialogFragment還是實際上是DialogFragment?如果答案是後者,請確保擴展該類而不是Fragment。在完成之後,將onCreateDialogExceed()重命名爲onCreateDialog(),當實際需要創建對話框時,該命令將由系統調用。

爲了顯示你從你的活動或片段需要一個參考對話片段,並做一些這樣的:在@ dev.bmax的回答

至於

new ExceedingLimitFragment().show(getFragmentManager(), TAG); 

爲您標題,finish()Activity的一種方法。Fragments或DialogFragments都不知道,因此您的IDE抱怨它是有道理的。爲了在碎片中使用它,請務必做

if(isAttached(){ 
    getActivity.finish(); 
} 
+0

你好。關於第一點,我已經刪除了onCreate調用中的'超級'標籤。這個可以嗎?另外,在第二段中,Studio聲明下一個類不會覆蓋它的超類。所以我已經把它留下了。而在最後一段中,只是一個問題 - 我可以使用dialog.cancel()來代替嗎?謝謝! – Mildwood

+1

如果你從Android重寫一個方法,確保在調用其他任何東西之前先調用'super'。看看FragmentDialogs的文檔,看看onCreateDialog的作用和創建時間:)至於'dialog.cancel()'問題,它取決於你想做什麼。如果你想關閉對話框,你應該調用'fragmentDialog.dismiss()'而不是'dialog.cancel()'。 FragmentDialogs基本上是一個承載對話框的片段,因此你希望片段爲你處理對話框。 –

1

公共靜態類MyAlertDialogFragment擴展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) 
        .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(); 
     } 
    } 

      public void showDialog() { 
       DialogFragment newFragment = MyAlertDialogFragment.newInstance(
         R.string.alert_dialog_two_buttons_title); 


     newFragment.show(getFragmentManager(), "dialog"); 
     } 



      public void doPositiveClick() { 
       // Do stuff here. 
       Log.i("FragmentAlertDialog", "Positive click!"); 
      } 

    public void doNegativeClick() { 
     // Do stuff here. 
     Log.i("FragmentAlertDialog", "Negative click!"); 
    } 


The activity creating this fragment may have the above methods to show the dialog and receive results from it, This is how you can define your dialog using dialog fragment and get the call backs in your project. 

希望這會幫助你。

+0

請寫一個簡要說明爲什麼這應該解決OP的問題。 – Michael

1

通常,你的子類DialogFragment。要啓動它,你實例化對話框片段並將其稱爲show方法。

new ExceedingLimitFragment().show(getFragmentManager(), TAG); 

注意:您應該getFragmentManager()或getSupportFragmentManager(),取決於使用哪個DialogFragment的版本,子類(android.app.DialogFragment或android.support.v4.app.DialogFragment)

1

你可以創建方法的ShowDialog(),並把這個代碼吧..這是多麼有兩個選項確定創建一個簡單的警告對話框或取消

new AlertDialog.Builder(context) 
     .setTitle("Add title ") 
     .setMessage("Add some message") 
     .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }) 
     .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 

      } 
     }) 
     .setIcon(android.R.drawable.ic_dialog_alert) 
     .show(); 

希望能幫助你!