DialogFragment中的findViewById – NullPointerException

我显示的对话框有两个Spinners,对于其中的一个我想设置选定的项目(要select的项目通过setArguments()/ getArguments()从主要活动中传递)

问题是我不能得到微调,而是我得到一个NullPointerException在

Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner);

DialogFragment代码:

 import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Spinner; public class DFrag extends DialogFragment { public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.activity_schedule_select_dialog, null)) .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mListener.onDialogPositiveClick(DFrag.this); } }) .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onDialogNegativeClick(DFrag.this); DFrag.this.getDialog().cancel(); } }); builder.setInverseBackgroundForced(true); return builder.create(); } public void onActivityCreated(Bundle savedInstanceState) { View view = getView(); Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); spinner.setSelection(getArguments().getInt("SelectWeek")); super.onActivityCreated(savedInstanceState); } public interface DFragListener { public void onDialogPositiveClick(DialogFragment dialog); public void onDialogNegativeClick(DialogFragment dialog); } DFragListener mListener; @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mListener = (DFragListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " Listener not implemented"); } } } 

根据要求,对话框的布局(activity_schedule_select_dialog.xml):

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/ssd_classLabel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/select_class_label" android:layout_marginRight="4dip" android:layout_marginLeft="4dip"/> <Spinner android:id="@+id/ssd_classSelectSpinner" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginBottom="4dip" android:entries="@array/urnikClasses"/> <TextView android:id="@+id/ssd_weekLabel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/select_week_label" android:layout_marginRight="4dip" android:layout_marginLeft="4dip"/> <Spinner android:id="@+id/ssd_weeksSelectSpinner" android:layout_width="fill_parent" android:layout_height="wrap_content" android:entries="@array/weeksArray"/> <CheckBox android:id="@+id/ssd_DefaultChkbox" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/ssd_DefaultChkBoxTxt"/> </LinearLayout> 

logcat的:

 05-12 13:16:16.288: E/AndroidRuntime(4310): FATAL EXCEPTION: main 05-12 13:16:16.288: E/AndroidRuntime(4310): java.lang.NullPointerException 05-12 13:16:16.288: E/AndroidRuntime(4310): at com.rogy.scks.urnik.DFrag.onActivityCreated(DFrag.java:91) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1468) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.os.Handler.handleCallback(Handler.java:725) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.os.Handler.dispatchMessage(Handler.java:92) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.os.Looper.loop(Looper.java:137) 05-12 13:16:16.288: E/AndroidRuntime(4310): at android.app.ActivityThread.main(ActivityThread.java:5195) 05-12 13:16:16.288: E/AndroidRuntime(4310): at java.lang.reflect.Method.invokeNative(Native Method) 05-12 13:16:16.288: E/AndroidRuntime(4310): at java.lang.reflect.Method.invoke(Method.java:511) 05-12 13:16:16.288: E/AndroidRuntime(4310): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 05-12 13:16:16.288: E/AndroidRuntime(4310): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 05-12 13:16:16.288: E/AndroidRuntime(4310): at dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "DialogFragment中的findViewById – NullPointerException"

find解决scheme,而不是试图findpublic void onActivityCreated(Bundle savedInstanceState)

public Dialog onCreateDialog(Bundle savedInstanceState)

我改变了

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); builder.setView(inflater.inflate(R.layout.activity_schedule_select_dialog, null)) .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mListener.onDialogPositiveClick(DFrag.this); } }) .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onDialogNegativeClick(DFrag.this); DFrag.this.getDialog().cancel(); } }); 

 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.activity_schedule_select_dialog, null); builder.setView(view) .setPositiveButton(R.string.ssd_select_positive, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mListener.onDialogPositiveClick(DFrag.this); } }) .setNegativeButton(R.string.select_negative, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mListener.onDialogNegativeClick(DFrag.this); DFrag.this.getDialog().cancel(); } }); 

并在最后补充说

 Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); spinner.setSelection(getArguments().getInt("SelectWeek")); 

首先将Spinner对象提取到类的成员。

 public class DFrag extends DialogFragment { private Spinner mSpinner; ... 

然后从onCreateDialog()函数分配你的微调

 public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.activity_schedule_select_dialog, null); // Assign spinner mSpinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); builder.setView(view); // Set positive and negative buttons here ... } 

现在将你的微调的值放在onCreateView()函数上

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mSpinner.setSelection(getArguments().getInt("SelectWeek")); ... } 

干杯!

这是由以下原因造成的:

 public void onActivityCreated(Bundle savedInstanceState) { View view = getView(); Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); spinner.setSelection(getArguments().getInt("SelectWeek")); super.onActivityCreated(savedInstanceState); } 

它给你一个NullPointerException,因为微调,它不是已经被选中,它是空的,当活动开始…你需要把这个, onItemSelected监听器。

 public class SpinnerActivity extends Activity implements OnItemSelectedListener { ... public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { // An item was selected. You can retrieve the selected item using // parent.getItemAtPosition(pos) } public void onNothingSelected(AdapterView<?> parent) { // Another interface callback } } 

有关更多信息,请参见: http : //developer.android.com/guide/topics/ui/controls/spinner.html#SelectListener

编辑:您还需要导入“R”Java文件..我没有看到它的import名单:

 import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.support.v4.app.DialogFragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.Spinner; 

编辑2:添加一个侦听器到微调这样做:

 Spinner spinner = (Spinner) view.findViewById(R.id.ssd_weeksSelectSpinner); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { public void onItemSelected(AdapterView<?> arg0, View v, int position, long id) { // int position is the element you pressed } });