微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android – 片段必须是一个公共静态类,以便从实例状态正确地重新创建

更新到最新的支持库后,
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:percent:24.2.0'
compile 'com.android.support:recyclerview-v7:24.2.0'

我得到了奇怪的例外.

java.lang.IllegalStateException: Fragment null must be a public static class to be  properly recreated from instance state.
at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435)
at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:414)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:154)
at com.androidapp.base.BaseActivity.showDialogFragment(BaseActivity.java:78)
at com.androidapp.MainActivity.showNewDialog(MainActivity.java:304)
at com.androidapp.MainActivity$6.onClick(MainActivity.java:228)

在我的BaseActivity类中,我创建了一个可重用的片段,可以在活动类中使用,扩展了BaseActivty

public void showDialogFragment(DialogFragment newFragment) {
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
        if (prev != null) {
            ft.remove(prev);
        }
        ft.addToBackStack("dialog");
        newFragment.show(ft,"dialog");
    }

回到MainActivty我已经使用了这样的片段,

public class MainActivity extends BaseActivity {

    @SuppressLint("ValidFragment")
        public void showNewDialog(int type,String title,String message) {
            final DialogNew dialog = new DialogNew() {
                @Override
                public void success(boolean isLandscape) {
                    .......
                }

                @Override
                public void cancel() {

                }
            };
            dialog.setArgs(title,message);
            super.showDialogFragment(dialog);
        }
}

DialogNew类在下面,

public abstract class DialogNew extends DialogFragment {

    private View rootView;

    private String title;
    private String message;

    public void setArgs(String title,String message) {
        Bundle args = new Bundle();
        args.putString("title",title);
        args.putString("message",message);
        setArguments(args);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE,0);
    }

    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_new_dialog,container,false);

        init();
        setListeners();

        return rootView;
    }

    public abstract void success(boolean isLandscape);

    public abstract void cancel();
}

PS:相同的代码与旧的支持存储库一起使用.

解决方法

错误并不是特别奇怪.如果你以前没有得到这个错误,那很奇怪.

作为配置更改(例如,屏幕旋转)的一部分,Android会破坏并重新创建碎片,并且作为重建任务(如果需要)的一部分(例如,用户切换到另一个应用程序,您的应用程序的进程在后台被终止,那么用户尝试返回到您的应用程序,所有在30分钟左右). Android无法重新创建DialogNew的匿名子类.

因此,建立一个普通的公共java类(或一个公共静态嵌套类),它扩展了DialogNew并具有业务逻辑,替代了目前使用的DialogNew的匿名子类.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐