FragmentActivity 与 ViewPager:方向更改时崩溃

2023-11-24

我在FragmentActivity中使用了ViewPager。当方向改变时我会崩溃。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    context = this;
    loadInitialData();
    setActionBar();
    initializeUiComponents();
}

private void initializeUiComponents() {
    // Set up the ViewPager with the sections adapter.
    mViewPager = (ViewPager) findViewById(R.id.pager);
    }

我的数据是从数据库动态获取的,我必须调用 Sysnctask,它在 onResume() 中从数据库获取数据。这是Asynctask 的onPostExecute()。

protected void onPostExecute(Void result) {
        
            mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
            mViewPager.setAdapter(mSectionsPagerAdapter);
        }
        mSectionsPagerAdapter.notifyDataSetChanged();
        }
}

添加FragmentAdapter代码:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }
    
    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a DummySectionFragment (defined as a static inner class
        // below) with the page number as its lone argument.
        Fragment fragment = new PayeeListSectionFragment();
        Bundle args = new Bundle();
        args.putInt(PayeeListSectionFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        return fragment;
    }
    
    @Override
    public int getCount() {
        return 2;
    }
    
    @Override
    public CharSequence getPageTitle(int position) {
        
        return string;
    }
}

添加片段代码:

public class PayeeListSectionFragment extends Fragment {
    /**
     * The fragment argument representing the section number for this fragment.
     */
    public static final String ARG_SECTION_NUMBER = "section_number";
    
    public PayeeListSectionFragment() {
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = null;
        \\ rootView inflated
        return rootView;
    }
}

使用的xml是:

 <android.support.v4.view.ViewPager
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".PayeeListActivity" >

    <!--
This title strip will display the currently visible page title, as well as the page
titles for adjacent pages.

    -->

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />
</android.support.v4.view.ViewPager>

我在方向改变时遇到以下崩溃:

06-07 11:01:57.834: E/AndroidRuntime(766): FATAL EXCEPTION: main  
06-07 11:01:57.834: E/AndroidRuntime(766): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.walletv2.activity/com.walletv2.activity.PayeeListActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment: make sure class name exists, is public, and has an empty constructor that is public  
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3692)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread.access$700(ActivityThread.java:141)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1240)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.os.Looper.loop(Looper.java:137)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread.main(ActivityThread.java:5041)
06-07 11:01:57.834: E/AndroidRuntime(766):  at java.lang.reflect.Method.invokeNative(Native Method)
06-07 11:01:57.834: E/AndroidRuntime(766):  at java.lang.reflect.Method.invoke(Method.java:511)
06-07 11:01:57.834: E/AndroidRuntime(766):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-07 11:01:57.834: E/AndroidRuntime(766):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-07 11:01:57.834: E/AndroidRuntime(766):  at dalvik.system.NativeStart.main(Native Method)
06-07 11:01:57.834: E/AndroidRuntime(766): Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment: make sure class name exists, is public, and has an empty constructor that is public
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.support.v4.app.Fragment.instantiate(Fragment.java:405)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1767)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:208)
06-07 11:01:57.834: E/AndroidRuntime(766):  at com.walletv2.activity.PayeeListActivity.onCreate(PayeeListActivity.java:78)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.Activity.performCreate(Activity.java:5104)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-07 11:01:57.834: E/AndroidRuntime(766):  ... 12 more
06-07 11:01:57.834: E/AndroidRuntime(766): Caused by: java.lang.InstantiationException: can't instantiate class com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment; no empty constructor
06-07 11:01:57.834: E/AndroidRuntime(766):  at java.lang.Class.newInstanceImpl(Native Method)
06-07 11:01:57.834: E/AndroidRuntime(766):  at java.lang.Class.newInstance(Class.java:1319)
06-07 11:01:57.834: E/AndroidRuntime(766):  at android.support.v4.app.Fragment.instantiate(Fragment.java:394)
06-07 11:01:57.834: E/AndroidRuntime(766):  ... 19 more

以下几行有一些提示:

引起原因:android.support.v4.app.Fragment$InstantiationException:无法实例化片段com.walletv2.activity.PayeeListActivity$PayeeListSectionFragment:确保类名存在,是公共的,并且有一个公共的空构造函数

And:

06-07 11:01:57.834:E / AndroidRuntime(766):引起:java.lang.InstantiationException:无法实例化类com.walletv2.activity.PayeeListActivity $PayeeListSectionFragment;没有空构造函数

这表明您已将参数化构造函数添加到您的PayeeListSectionFragment内部类。不幸的是,这行不通,因为 Android 依赖于使用反射调用非参数化构造函数,以便在配置更改(除其他外)时恢复片段的状态。

如果您想向片段提供一个或多个参数,则必须将它们插入到Bundle并将其设置为参数,使用setArguments(Bundle)。看看DetailsFragment and CountingFragment在文档中有关如何执行此操作的示例。


这个问题也可能在另一种情况下出现,对于那些不太熟悉 Java 的人来说可能不太明显。如果你的片段是一个嵌套类Activity,确保声明了内部类static。例如,在上述问题的上下文中,它应该是public static class PayeeListSectionFragment(重点是static修饰符)。这样内部类就不会保留对外部类的引用,并且可以有自己的生命周期,而不需要对外部类有任何依赖。如果没有 static 修饰符,则在不实例化外部类的情况下无法实例化嵌套类,这意味着 Android 在尝试重新实例化片段类时会遇到问题。

另一种解决方案是将内部类移至其自己的类中.java文件。这样,任何外部类依赖项都会自动删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FragmentActivity 与 ViewPager:方向更改时崩溃 的相关文章

随机推荐

  • 将 Python 函数存储在 JSON 中

    假设我有一个 JSON 文件 如下所示 x 5 y 4 func def multiplier a b return a d 这过度简化了我想要尝试和做的事情 但基本上我正在尝试将 python UDF 写入 JSON 文件 有没有办法做到
  • 为什么仅在存在存储初始化循环时才计算用户模式 ​​L1 存储未命中事件?

    Summary 考虑以下循环 loop movl 0x1 rax add 0x40 rax cmp rdx rax jne loop where rax被初始化为大于 L3 缓存大小的缓冲区的地址 每次迭代都会对下一个缓存行执行存储操作 我
  • Clojure 中的不一致:宏中的函数和 IllegalArgumentException

    以下两个在宏中使用函数的示例导致评估没有错误 defmacro works let f fn 1 f works gt 1 defn my nullary fn fn 2 defmacro also works let f my nulla
  • Rails habtm 连接

    我之间有这种关系类别 产品和品牌 class Brand lt ActiveRecord Base has many products end class Category lt ActiveRecord Base has and belo
  • x86 CPU 上中断延迟的估计

    我正在寻找有助于估计 x86 CPU 中断延迟的信息 这篇非常有用的论文可以在 datasheets chipdb org Intel x86 386 technote 2153 pdf 中找到 但这篇论文给我提出了一个非常重要的问题 如何
  • 在Java中,如何从派生类中的重写方法调用基类的方法?

    我有两个Java类 B 它扩展了另一个类A 如下 class A public void myMethod class B extends A public void myMethod Another code 我想致电A myMethod
  • 用户代理可以在其请求中设置大于零的 max-age 吗?

    我有一个疑问max age读取 Http 缓存后的行为rfc 设想 用户代理 GET foo 源服务器响应头 cache control max age 120 服务器告诉用户代理所请求的资源应在 2 分钟后重新验证 1分零几秒后 用户代理
  • 将列和行大小重置为默认值

    我正在构建一个脚本 通过自定义菜单项访问 其中还将包含一些样式 例如设置背景颜色 更改列宽 行高以及插入大量内容 现在我想实现一个 重置 功能 setall单元格恢复为默认的空 Google 表格的样子 包括所有内容 我找到了clear f
  • UISearchController - 警告尝试加载视图控制器的视图

    我收到以下错误 尝试加载视图控制器的视图 不允许解除分配并可能导致未定义的行为 尝试了以下解决方案 但对我不起作用正在解除分配时尝试加载视图控制器的视图 UISearchController 链接中提供了演示项目 点击主控制器中的添加按钮
  • Google App Engine 模块间通信授权

    In the 谷歌文档 it says 您可以将任何手动或基本扩展模块配置为接受来自应用程序中其他模块的请求 方法是将其处理程序限制为仅允许管理员帐户 并在模块的配置文件中为适当的处理程序指定 login admin 实施此限制后 来自应用
  • “控制器”是命名空间,但像类型一样使用

    当我创建新控制器时总是抛出错误 Controller 是命名空间 但像类型一样使用 我不知道如何修复它 我已经安装了该包 在此输入图像描述 将文件夹名称更改为 Controllers 将命名空间更改为 Controllers 因此您的代码应
  • 未复制引用的项目依赖项 DLL

    我的项目解决方案目前有三个项目 我的项目 这是我的主要启动项目 使用 NET Framework 4 7 WPF 特定于 UI 我的项目 核心 类库 NET Standard 2 0 保存模型以及所有 幕后 数据 我的项目 关系 类库 NE
  • SwiftUI 更新核心数据对象更改视图

    我遇到的问题是 当我从工作表视图更新核心数据资产对象时 更改不会反映在 AssetListView 的 UI 中 请注意 从工作表视图插入新对象does刷新 AssetListView 的 UI 删除工作表视图中的对象也刷新AssetLis
  • 在jsp中显示日期差异

    我在数据库中有一个日期字段 仅存储日期而不存储时间 现在我想知道在 jsp 页面中显示当前日期和我的日期字段的天数差异 所以我应该喜欢 databaseDate 2012 11 30 currentDate 2012 11 27 3 day
  • MS Access 编程概述 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我是一名 Java EE 开发人员 刚刚有人联系我 希望我为他的业务提供一个可以与他们的 MS Access 后端 集成的应用程序的报价 我希望发布
  • 为什么 XML 中的节点顺序很重要?

    我最近一直在处理一个 API 它要求 XML 文档的节点按特定顺序排列 我想知道为什么他们觉得有必要强制执行这一点 而我完全找不到理由让事情变成这样 例如 这是正确的 xml 大大简化
  • 将 exe 从一个项目复制到另一个项目的调试输出目录

    我有两个项目 ProjOne exe 和 ProjTwo exe 我想构建 ProjOne exe 它知道它依赖于 ProjTwo exe 因此它在构建 ProjOne exe 时会复制 ProjTwo exe 我还有一个 ProjThre
  • jQuery:当div变得可见时如何为其绑定事件?

    我有一个 div 元素 div Tab data div 当这个 div 变得可见时如何绑定自定义事件 获取display block 而且我想在这个 div 变得不可见时绑定一个事件 获取display none 我想用 jQuery 来
  • 如何将列添加到架构的开头?

    Dataset withColumn 似乎将该列附加到架构的末尾 如何将列添加到架构的开头 Use select带通配符 df select new column col
  • FragmentActivity 与 ViewPager:方向更改时崩溃

    我在FragmentActivity中使用了ViewPager 当方向改变时我会崩溃 Override protected void onCreate Bundle savedInstanceState super onCreate sav