【问题标题】:Fragment activity crashes on screen rotate屏幕旋转时片段活动崩溃
【发布时间】:2016-08-25 04:37:28
【问题描述】:

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

【问题讨论】:

  • 你的片段有一个公共的空构造函数?
  • 很难说没有整个堆栈跟踪。 (这三行只是其中的一部分。)在堆栈跟踪周围发布一个健康的日志块可能是最安全的,以防万一那里有感兴趣的东西。您的 Fragment 的 onCreate 方法是什么样的?
  • 你是从布局文件中引用你的 Fragment 子类吗?纵向和横向有不同的布局文件吗?

标签: android android-fragments


【解决方案1】:

好吧,正如您所说的,您的 MyFragment 类有问题。确保你有类似的东西:

public class MyFragment extends Fragment

在声明片段类时。此外,你不应该在类中有任何构造函数。所以请确保您没有。

如果您发布 Fragment 类的代码,我们可能会为您提供更好的帮助。

【讨论】:

  • 感谢大家的帮助。片段类和片段活动类的结构如下: 在源文件 MyActivity.java 中,------------ public class MyActivity extend FragmentActivity{ ... } class MyFragment extends Fragment{ ... } ------------------ MyFragment 是同一源文件中的非公共类,它会导致应用程序在旋转显示时崩溃。通过将 MyFragment 类作为内部类放入 MyActivity 类,它解决了这个问题。谢谢大家。
  • 吉米,就像我在回复中所说的那样。你需要让 MyFragment 是公开的。否则事情将无法正常工作。
  • 对,当然。对不起,我错过了。实际上,我将 MyFragment 类作为 MyActivity 类的内部公共静态类,它起作用了。再次感谢。
  • thx kurtis,我也有同样的问题,解决方案就像你说的“,你不应该在类中有任何构造函数”
  • "你不应该在类中有任何构造函数" - 这是正确的吗?我的意思是,我想我们可以在类中有构造函数,但我们还需要有一个空的构造函数。错误对我来说很清楚:确保类名存在,是公共的,并且有一个公共的空构造函数。大家觉得呢?
【解决方案2】:

您的 Fragment 不应该有构造函数,因为 FragmentManager 如何实例化它。 您应该定义一个 newInstance() 静态方法并通过参数(包)传递任何参数

例如:

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);

    //...

}

这样,如果分离并重新附加,对象状态可以通过参数存储,就像附加到 Intent 的捆绑包一样。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        添加

        static
        

        帮我修好了

        public class MyFragment extends Fragment
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多