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

18

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


你的代码片段有一个公共的空构造函数吗? - superfell
很难在没有整个堆栈跟踪的情况下确定。 (这三行只是其中的一部分。)最好还是发布围绕堆栈跟踪的日志的大块内容,以防里面有什么有趣的东西。你的Fragment的onCreate方法是什么样子的? - nmr
你是否在布局文件中引用了Fragment子类?你是否有不同的纵向和横向布局文件? - nmr
5个回答

22

好的,正如您的错误所述,您的MyFragment类出现了问题。请确保您有类似以下的内容:

public class MyFragment extends Fragment

在声明你的片段类时,不应该有任何构造函数。因此,请确保你没有构造函数。

如果你贴出你的片段类代码,我们可能会更好地帮助你。


感谢所有人的帮助。片段类和片段活动类的结构如下:在源文件MyActivity.java中,
public class MyActivity扩展FragmentActivity{ ... } class MyFragment扩展Fragment{ ... }
MyFragment是同一源文件中的非公共类,它会导致应用程序在旋转显示时崩溃。将MyFragment类作为内部类放入MyActivity类中可以解决这个问题。谢谢大家。
- Jimmy
Jimmy,就像我在回复中所说的那样。你需要将MyFragment设置为public。否则事情就无法正常工作。 - Kurtis Nusbaum
1
当然,没错。抱歉我错过了那个。实际上,我将MyFragment类作为MyActivity类的内部公共静态类,它起作用了。再次感谢。 - Jimmy
使用setArguments函数来传递参数给一个片段,@Ixx。 - Kurtis Nusbaum
1
“你的类中不应该有任何构造函数” - 这正确吗?我的意思是,我们可以在类中有构造函数,但同时需要有一个空构造函数。这个错误对我来说很明显:“确保类名存在、是公共的,并且具有一个公共的空构造函数”。你们觉得呢? - Paul
显示剩余4条评论

8

由于FragmentManager实例化Fragment的方式,您的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);

    //...

}

这样,如果对象被分离并重新连接,对象状态可以通过参数存储,就像附加到意图的包裹一样。


1
当我重命名项目包名称时,我遇到了类似的问题。片段类由xml布局引用,并且通常包含完整的包名称。这就是问题所在。我的片段类名称仍然具有旧的包名称。

1

Fragment类也不应该是内部类,因为它是在Activity类范围之外实例化的。嵌套类可以。


0

添加

static

这个问题已经被我解决了

public class MyFragment extends Fragment

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接