Java 方向改变时碎片崩溃

Java 方向改变时碎片崩溃,java,android,android-fragments,Java,Android,Android Fragments,我的应用程序在方向改变时崩溃。发生这种情况时,我会遵循默认的建议,即每个片段都有一个无参数构造函数,并且由于我在MainActivity中实现了片段,因此它们被声明为静态的。然而,我仍然面临着同样的例外,就好像我没有这样做一样 public class MainActivity extends FragmentActivity { public static final String URL = "url"; public static final String

我的应用程序在方向改变时崩溃。发生这种情况时,我会遵循默认的建议,即每个片段都有一个无参数构造函数,并且由于我在MainActivity中实现了片段,因此它们被声明为静态的。然而,我仍然面临着同样的例外,就好像我没有这样做一样

public class MainActivity extends FragmentActivity {

    public static final String      URL = "url";
    public static final String      ID  = "id";

    private SettingsPageAdapter     pageAdapter;
    private ViewPager               pager;
    private FrameLayout             layoutTabBar;

    public static class SettingsPageAdapter extends FragmentPagerAdapter {


        private final List<Fragment>    fragments;

        public SettingsPageAdapter(FragmentManager fm) {
            super(fm);
            fragments = new ArrayList<Fragment>();
        }

        public void addWebViewItem(String url, String id) {
            final Fragment settingsFragment = new SettingsWebView();
            final Bundle bundle = new Bundle();
            bundle.putString(URL, url);
            bundle.putString(ID, id);
            settingsFragment.setArguments(bundle);
            this.fragments.add(settingsFragment);
        }

        public void addItem(Fragment f, String id) {
            final Bundle bundle = new Bundle();
            bundle.putString(ID, id);
            f.setArguments(bundle);
            this.fragments.add(f);
        }

        @Override
        public Fragment getItem(int position) {
            return this.fragments.get(position);
        }

        @Override
        public int getCount() {
            return this.fragments.size();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {

            getSupportFragmentManager().beginTransaction()
                .add(R.id.bar, new BarFragment()).commit();
        }

        pageAdapter = new SettingsPageAdapter(getSupportFragmentManager());

        pageAdapter.addWebViewItem("https://www.google.com", "WebView 1");
        pageAdapter.addWebViewItem("https://m.bbc.co.uk", "WebView 2");
        pageAdapter.addWebViewItem("http://thorbek.net", "WebView 3");
        pageAdapter.addItem(new ContainerFragment(), "container");

        pager = (ViewPager) findViewById(R.id.container);
        pager.setOffscreenPageLimit(pageAdapter.getCount() - 1);
        pager.setAdapter(pageAdapter);

        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                Log.d("PAGER", "onPageSelected");

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                Log.d("PAGER", "onPageScrolled");

            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                Log.d("PAGER", "onPageScrollStateChanged");
                final int currentItem = pager.getCurrentItem();
                final BarFragment barFragment = (BarFragment) getSupportFragmentManager()
                    .findFragmentById(R.id.bar);
                barFragment.setCurrentItem(currentItem);

            }
        });

        layoutTabBar = (FrameLayout) findViewById(R.id.bar);
        initAnimation();
    }

    private void initAnimation() {
         ...
    }

    public static class BarFragment extends Fragment {

        private final List<Button>  buttons         = new ArrayList<Button>();
        private int                 currentIndex    = -1;


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

            initButtons(rootView);

            return rootView;
        }

        @SuppressWarnings("deprecation")
        public void setCurrentItem(int index) {

            if (currentIndex != index) {

                resetButtons();
                buttons.get(index).setBackgroundDrawable(
                    buttons.get(index).getContext().getResources()
                            .getDrawable(R.drawable.button_settings_pressed));
                currentIndex = index;
            }
        }

        @SuppressWarnings("deprecation")
        private void initButtons(final View rootView) {

            ...
        }

        @SuppressWarnings("deprecation")
        private void resetButtons() {
            ...
        }
    }
java:79位于 super.onCreatesavedInstanceState


因此,在创建MainActivity时会立即抛出它。

异常非常明显

确保类名存在,是公共的,并且有一个公共的空构造函数

您的BarFragment类必须是公共的

public static class BarFragment extends Fragment
或者,您可以通过在创建片段时执行以下操作来避免重新创建片段

fragment.setRetainInstance(true)

看起来你的条形码碎片不是公开的。试着把它改成

 public static class BarFragment extends Fragment
此外,您不应该将自己的空构造函数添加到片段中。默认构造函数将自动设置,并应正确处理还原状态。如果需要向片段传递参数,请尝试使用静态newInstance方法并为其分配一个bundle

请参阅这些文档以了解更多说明:

基本上删除您添加的构造函数

祝你好运

setRetainInstance(true);
我刚刚写了这条线,它解决了我的问题

我的代码示例:

public  class PlaceholderFragment extends Fragment{
    String str;
    public PlaceholderFragment (String strDesc1){
        this.str=strDesc1;
        setRetainInstance(true);  //Hear put this line
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.quiz_play_descrption_frg_one_, null,false);
        TextView txtdisc=(TextView) rootView.findViewById(R.id.txt_Discription_quizPlayFragment);
        txtdisc.setText(str);

        return rootView;
    }
}

当方向更改时,活动将再次重新创建,您必须使用savedInstanceState来维护碎片状态

if(savedInstanceState == null) 
{
    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    FragmentOne fragment = new FragmentOne();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}

请发布异常,它有助于定位错误Nope,将其更改为public,仍因相同的异常而崩溃Nope,将其更改为public,仍因相同的异常而崩溃。以前也尝试过。谢谢,是的,不重写空构造函数是有意义的,尽管调用super会得到与不重写相同的结果。但是,删除构造函数没有帮助。我调整了发布的源代码。如果所有其他操作都失败,您可以尝试在自己的类中定义片段,而不是将其作为活动的内部类。
if(savedInstanceState == null) 
{
    mFragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();

    FragmentOne fragment = new FragmentOne();

    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}