【问题标题】:Android unable to create DialogFragmentAndroid 无法创建 DialogFragment
【发布时间】:2014-05-21 14:39:56
【问题描述】:

我正在尝试创建许多教程中显示的简单对话框片段,但是仍然遇到一些错误并且无法弄清楚。到目前为止,我拥有的是 MainActivity,它在其布局上保存了片段。我想做的是,一旦用户点击按钮,就显示 DialogFragment。

MainActivity.java

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment()).commit();
    }

}

/**
 * A placeholder fragment containing a simple view.
 */
public static class PlaceholderFragment extends Fragment {

    private Button btn1;

    public PlaceholderFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_main, container,
                false);



        return rootView;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);
        btn1 = (Button) getActivity().findViewById(R.id.button1);

        btn1.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                new MyDialogFragment().show(getFragmentManager(), "MyDialog");
            }

        });
    }
}
}

MyDialogFragment.java

class MyDialogFragment extends DialogFragment{

Context mContext;


public MyDialogFragment() {
    mContext = getActivity();
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
    alertDialogBuilder.setTitle("Really?");
    alertDialogBuilder.setMessage("Are you sure?");
    //null should be your on click listener
    alertDialogBuilder.setPositiveButton("OK", null);
    alertDialogBuilder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
        }
    });


    return alertDialogBuilder.create();
}
}

这里是日志,如果我点击按钮就会得到。

05-21 10:36:57.600: D/dalvikvm(1913): Not late-enabling CheckJNI (already on)
05-21 10:36:57.770: D/(1913): HostConnection::get() New Host Connection established 0xb9816d80, tid 1913
05-21 10:36:57.810: W/EGL_emulation(1913): eglSurfaceAttrib not implemented
05-21 10:36:57.820: D/OpenGLRenderer(1913): Enabling debug mode 0
05-21 10:37:01.200: D/AndroidRuntime(1913): Shutting down VM
05-21 10:37:01.200: W/dalvikvm(1913): threadid=1: thread exiting with uncaught exception (group=0xb0d47b20)
05-21 10:37:01.200: E/AndroidRuntime(1913): FATAL EXCEPTION: main
05-21 10:37:01.200: E/AndroidRuntime(1913): Process: com.example.dialog, PID: 1913
05-21 10:37:01.200: E/AndroidRuntime(1913): java.lang.NullPointerException
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:143)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.app.AlertDialog$Builder.<init>(AlertDialog.java:360)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at com.example.dialog.MyDialogFragment.onCreateDialog(MyDialogFragment.java:22)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:295)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.os.Handler.handleCallback(Handler.java:733)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.os.Handler.dispatchMessage(Handler.java:95)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.os.Looper.loop(Looper.java:136)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at android.app.ActivityThread.main(ActivityThread.java:5017)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at java.lang.reflect.Method.invokeNative(Native Method)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at java.lang.reflect.Method.invoke(Method.java:515)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
05-21 10:37:01.200: E/AndroidRuntime(1913):     at dalvik.system.NativeStart.main(Native Method)

提前致谢

【问题讨论】:

    标签: java android exception android-fragments android-dialogfragment


    【解决方案1】:

    getActivity 在调用 onAttach 之前返回 null。改变

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
    

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
    

    【讨论】:

    • 谢谢,就像一个魅力 :) 但是,如果我想使用自定义布局创建 dialogFragment,则需要使用 onCreateView 方法将 xml 布局文件附加到片段对象,但是,在那之后,如果我例如,想要为按钮创建侦听器,我应该使用哪种方法? onCreateDialog 或 onCreateActivity 还是哪一个?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多