碎片活动在屏幕旋转时崩溃

时间:2011-11-09 00:06:32

标签: android android-fragments

我有一个简单的片段活动。在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:无法执行   实例化片段:确保类名存在,是公共的,并且具有   一个公开的空构造函数

5 个答案:

答案 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