2013-04-24 52 views
2

我想在DialogFragment上設置監聽器,但不斷收到空指針異常。當設置OnCancelListener時DialogFragment空指針

這是我DialogFragment子類:

public static class TermsFragment extends DialogFragment { 
     TextView t; 
     private static String terms; 

     static TermsFragment newInstance(String termsCond) { 
      TermsFragment f = new TermsFragment(); 
      terms = termsCond; 
      return f; 
     } 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      getDialog().setCanceledOnTouchOutside(true); 
      View v = inflater.inflate(R.layout.termsandconditions, container, false); 

      getDialog().setTitle("Terms and Conditions"); 

      t = (TextView) v.findViewById(R.id.termsText); 

      t.setText(terms); 

      return v; 
     } 
    } 

,我從我的主要SherlockFragment調用它是這樣的:

TermsFragment newFragment = TermsFragment.newInstance(terms); 
newFragment.show(getFragmentManager(), "dialog"); 

這說明我的對話框罰款。當我嘗試添加一個按鈕偵聽這樣的:

TermsFragment newFragment = TermsFragment.newInstance(terms); 
Button cancel = (Button) newFragment.getDialog().findViewById(R.id.btnCancel); 
     cancel.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Log.e(TAG, "Clicked"); 

      } 
     }); 

或一般onCancel偵聽器是這樣的:

newFragment.getDialog().setOnCancelListener(new Dialog.OnCancelListener() { 

      @Override 
      public void onCancel(DialogInterface dialog) { 
       showLoadingView(false); 

      } 
     }); 

我的應用程序一個空指針異常崩潰顯示對話框之前。

我在做什麼錯?

回答

1

而不是使用public View onCreateView爲什麼不嘗試使用public Dialog onCreateDialog。這裏有一個例子:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    LayoutInflater inflater = getActivity().getLayoutInflater(); 

    Bundle args = getArguments(); 
    currentName = args.getString(ARG_CURRENT_NAME); 

    builder.setView(inflater.inflate(R.layout.name_dialog, null)); 
    builder.setTitle("Rename Rapper Program"); 
    builder.setMessage("Enter a new name for " + currentName + ":"); 
    builder.setPositiveButton("Rename", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      newName = (EditText) getDialog().findViewById(R.id.new_name); 
      newProgName = newName.getText().toString(); 
      mRename.renameProgram(currentName, newProgName); 
     } 
    }); 
    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dismiss(); 
     } 
    }); 

    return builder.create();  
} 

您將繼續使用.show()因爲你現在擁有它,你可以你想達到什麼目的後建模。