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