2013-04-24 55 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()因为你现在拥有它,你可以你想达到什么目的后建模。