Fragment null必须是要从实例状态正确重新创建的公共静态类

时间:2016-10-11 13:54:34

标签: java android android-studio android-fragments alertdialog

我无法弄清楚为什么我的应用程序在调用getSupportFragmentManager()时崩溃。我在其他应用程序中使用了类似的代码来创建警告对话框而没有任何问题。请帮忙!

DialogFragment df = new DialogFragment(){

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            View view = getActivity().getLayoutInflater().inflate(R.layout.addincome,null);
            builder.setView(view);
            //capture
            final EditText amountEditText=(EditText)view.findViewById(R.id.edit_amount);
            final EditText descriptionEditText=(EditText)view.findViewById(R.id.edit_description);
            builder.setNegativeButton(android.R.string.cancel,null);
            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    newIncome.setAmount(Double.parseDouble(amountEditText.getText().toString()));
                    newIncome.setDescription(descriptionEditText.getText().toString());
                    user.incomes.add(newIncome);
                    HashMap<String,User> modified = new HashMap<>();
                    modified.put(uid,user);
                    rootref.setValue(modified);
                }
            });
            return builder.create();
        }
    };
    df.show(getSupportFragmentManager(),"addIncome");

3 个答案:

答案 0 :(得分:5)

您的DialogFragment是一个匿名类,在Java中,匿名类只能由父类实例化:new DialogFragment()实际上是this.new DialogFragment()。显然,当FragmentManager尝试在配置更改时重新创建DialogFragment时,它不能,因为它无法访问父类的实例。解决方案是声明static的{​​{1}}子类,或者声明DialogFragment的顶级子类,并使用它而不是匿名类。

答案 1 :(得分:0)

我知道你已经完成了这一步,但只是问你是否试图重建你的APK?因为如果这段代码适用于其他应用程序,那么它们必须是一些.classes问题。

答案 2 :(得分:0)

使用android.support.v4.app.Fragment或android.os.Fragment检查您的导入中包含哪种类型的片段。