我有一个简单的片段活动。在onCreate()方法中,我只是添加一个片段。代码发布在下面。但是,每次旋转屏幕时,系统都会再次调用onCreate(),然后在super.onCreate()语句中崩溃;我想这是一个普通的Android片段问题。有人可以帮我吗?
public class FragActivity extends FragmentActivity {
@Override
public void onCreate(Bundle savedState){
super.onCreate(savedState);
MyFragment frag = new MyFragment();
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, frag)
.commit();
}
}
附加了堆栈跟踪:
java.lang.RuntimeException:无法启动活动ComponentInfo {}: android.support.v4.app.Fragment $ InstantiationException:无法执行 实例化片段:确保类名存在,是公共的,并且具有 一个公开的空构造函数
答案 0 :(得分:22)
好吧,正如你的错误所说,你的MyFragment类有问题。确保你有类似的东西:
public class MyFragment extends Fragment
声明片段类时。此外,您不应该在类中有任何构造函数。所以请确保你没有。
如果你发布了Fragment类的代码,我们可以帮助你做得更好。
答案 1 :(得分:4)
由于FragmentManager如何实例化它,你的Fragment不应该有构造函数。
您应该定义newInstance()
静态方法,并通过参数(bundle)
例如:
public static final MyFragment newInstance(int title, String message)
{
MyFragment fragment = new MyFragment();
Bundle bundle = new Bundle(2);
bundle.putInt(EXTRA_TITLE, title);
bundle.putString(EXTRA_MESSAGE, message);
fragment.setArguments(bundle);
return fragment ;
}
在onCreate上阅读这些论点:
@Override
public void onCreate(Bundle savedInstanceState)
{
title = getArguments().getInt(EXTRA_TITLE);
message = getArguments().getString(EXTRA_MESSAGE);
//...
}
这种方式如果分离并重新附加对象状态可以通过参数存储,就像附加到Intents的bundle一样。
答案 2 :(得分:1)
当我重命名我的项目包名称时,我遇到了类似的问题。片段类由xml布局引用,通常包含完整的包名称。问题出在哪里。我的片段类名仍然有旧的包名。
答案 3 :(得分:1)
Fragment类也不应该是内部类,因为它是在Activity类范围之外实例化的。 嵌套类是可以的。
答案 4 :(得分:0)
添加
static
为我修好了
public class MyFragment extends Fragment