如何在MainActivity中获取ViewPager创建的fragment的元素?

2023-11-29

我有几个片段,它们是用ViewPager。我添加一个addOnPageChangeListener to the ViewPager在 MainActivity 中onCreate给出所选片段位置的方法。

尽管我通过声明防止碎片自我毁灭setOffscreenPageLimit,我仍然没有弄清楚如何从 MainActivity 访问片段,只需使用findViewById返回空对象异常。

我想做的事:

我想访问片段的元素,例如布局和滚动视图,在OnPageListener of the ViewPager:

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

@Override
    public void onPageSelected(int i) {

        if(i == 0) {
            // Do something with the first fragment.
        } else if(i == 1) {
            // Do something with the second fragment.
        }

    }

}

The ViewPager uses a FragmentPagerAdapter:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                return Fragment1.newInstance(position);
            case 1:
                return Fragment2.newInstance(position);
            case 2:
                return Fragment3.newInstance(position);
            case 3:
                return Fragment4.newInstance(position);
            default:
                throw new IllegalArgumentException();
        }
    }

    @Override
    public int getCount() {
        return 4;
    }
}

添加如下:

mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mSectionsPagerAdapter);

~

或者我应该改变我的方法?

如果这种设计无法实现访问片段,那么有效的替代路线是什么?

我尝试过实施ViewPager.onPageChangeListener在习俗中ViewPager,但这似乎不是一个好的选择。

我可以处理各自片段中的元素,但这是一个乏味的过程并且难以维护,这就是我寻找一种同时处理它们的方法的原因。

我知道以前曾有人问过类似的问题,但我没有在其中找到解决方案。


不幸的是唯一"safe"方法是检查源代码FragmentPagerAdapter,看看有什么tag是片段添加了 - 因为findFragmentByTag是从 FragmentManager 获取 Fragment 的唯一安全方法。

当然,我们需要希望这个实现细节在支持库版本之间不会改变,但实际上它已经很多年没有改变了:)


无论如何,FragmentPagerAdapter 说:

    // Do we already have this fragment?
    String name = makeFragmentName(container.getId(), itemId);
    Fragment fragment = mFragmentManager.findFragmentByTag(name);

那么什么是name?

private static String makeFragmentName(int viewId, long id) {
    return "android:switcher:" + viewId + ":" + id;
}

What is viewId是什么id?

视图 ID 是container.getId(), where container is the ViewPager itself.

id is: final long itemId = getItemId(position);默认情况下是return position;.


所以你可以找到Fragment如下:

Fragment fragment = fragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);
// if fragment is null, it was not created yet by ViewPager

NOTE:

值得注意的是,您不应该依赖getItem(int position) {回来与您传入的片段实例相同,因为这会导致你这个问题。 (这道题做对了,getItem()方法必须始终返回一个新的 Fragment 实例。)

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

如何在MainActivity中获取ViewPager创建的fragment的元素? 的相关文章

随机推荐

  • VueJS 动态属性名称不更新值

    我正在尝试实现一个关联数组并结合访问值中的属性 键基于活动对象的值 li li
  • 为什么迭代大型 Django QuerySet 会消耗大量内存?

    该表包含大约一千万行 for event in Event objects all print event 这会导致内存使用量稳定增加到 4 GB 左右 此时行会快速打印 第一行打印之前的漫长延迟让我感到惊讶 我预计它几乎会立即打印 我也尝
  • 有没有办法获取带有非局部变量的 dict 对象? [复制]

    这个问题在这里已经有答案了 我想知道 Python 中是否有一个函数返回一个 dict 对象 其中包含用于封闭函数的非局部变量 喜欢vars or locals 对于局部变量或globals 对于全球的 更新 正如 thebjorn 所指出
  • 当我尝试克隆不存在的存储库时,如何阻止 git 询问凭据?

    我正在做一些研究 我需要下载大量的 git 存储库 大约 17k 我编写了一个非常简单的 Python 脚本 用于自动从包含 GitHub URL 的数据集进行克隆例程 first 10 data url name data project
  • 如何创建结构体数组

    我想实现一个搜索表 这是数据 20130610 Diamond CoinMate 11 7246 15 7762 2897 20130412 Diamond Bithumb 0 209 0 2293 6128 20130610 OKCash
  • 通过 youtube api 检索视频的公共统计数据

    可以获取视频的公开统计数据吗 使用这样的东西我可以获得视频的总观看次数和点赞数 https www googleapis com youtube v3 videos part statistics key API KEY id ekzHIo
  • 如何将模型绑定到 List

    我正在努力完成这样的事情 我觉得这是可能的 如果不是 可能是 MVC 框架中的疏忽 View 分部视图是可编辑的表单 强类型化为单个 MyViewModel 并使用 MyViewModel 类上的 DataAnnotations 进行验证
  • 使用“std::conditional_t”根据其模板参数定义类“typedef”

    我尝试使用std conditional t定义一个类A s typedef取决于其模板参数T template lt typename T gt class A public typedef std conditional t lt st
  • 从本地 Spark 实例读取 Google 存储 gs:// 文件系统

    问题非常简单 您有一个本地 Spark 实例 集群或仅在本地模式下运行 并且您想从 gs 读取数据 在 Spark 2 4 3 上 我需要执行以下操作才能从 Spark 本地启用 GCS 访问 我使用 JSON 密钥文件与client id
  • HTTP POST 返回错误:417“预期失败。”

    当我尝试 POST 到 URL 时 会导致以下异常 远程服务器返回错误 417 期望落空 这是示例代码 var client new WebClient var postData new NameValueCollection postDa
  • 从标头(邮递员)发出访问令牌请求时出现错误

    从标头发出访问令牌请求时 出现以下错误 错误 错误 不支持的授权类型 error description 不支持授予类型 我做错了什么或者错过了什么吗 请帮忙 附上截图 在此输入图像描述 您使用了错误的选项卡 标题应该只有 1 2 Cont
  • 如何在 C# 中从字节数组中删除和添加字节

    我有一个配置文件 cfg 用于创建命令行应用程序以将用户添加到 SFTP 服务器应用程序 cfg 文件需要为 cfg 文件中的每个条目保留一定数量的保留字节 我目前只是通过创建字节数组并将其转换为字符串 然后将其复制到文件中 将新用户附加到
  • 使用并行有线 RS232 从多个设备接收数据

    我目前正在开发一个小型应用程序 用于监控太阳能集热器产生的功率 电流 该阵列连接到 3 个逆变器 每台逆变器都有一个RS232接口 每10秒传输一行信息 当前状态 由于我想使用只有一个串行端口的设备进行监控 因此我需要想出一种能够并行读取所
  • Windows Phone 7:文件流异常

    我尝试使用 FileStream 使用命名空间 System IO 但出现异常 Attempt to access the method failed 这是代码 FileStream fs new FileStream file txt F
  • 如何使用 apache POI XWPFDocument 从 java 创建多级项目符号和编号?

    我已经阅读了许多与我的要求相关的博客和论坛 但到目前为止 我能够在获得的所有帮助下生成第一级的项目符号或编号 任何人都可以指导我如何使用 apache poi 创建多级编号 想知道 Apache POI XWPFDocument 是否支持这
  • 使用 KSOAP Android 创建 SOAP 请求

    我需要生成一个像这样的肥皂请求 SOAP请求 POST TennisMasters TennisMasters Listener asmx HTTP 1 1 Host playinkstudio com Content Type text
  • 使用 mod_rewrite 从子域重定向到主域

    我的问题是我有一个正常运行的子域 sub mydomain com sub 已加载到 mydomain com sub 中 我想做的是将所有对 sub mydomain com 的请求重定向到 mydomain com 不知怎的 当我是子域
  • SQL 过程 XML 性能:插入表中的列

    我在 SQL 过程中遇到问题 但似乎找不到正确的解决方案 该存储过程包含一个 XML 数据类型的参数 名称 data 传入消息的示例如下 实际消息包含更多节点 但为了简单起见 我将它们省略了
  • 使用 GDI+ API 绘制图像

    我正在使用GDI API 只是为了显示图像 bmp 屏幕上 这是执行任务的函数的代码 void drawImg ArmorInfo PupupWnd HDC hdc GdiplusStartupInput gdiplusStartupInp
  • 如何在MainActivity中获取ViewPager创建的fragment的元素?

    我有几个片段 它们是用ViewPager 我添加一个addOnPageChangeListener to the ViewPager在 MainActivity 中onCreate给出所选片段位置的方法 尽管我通过声明防止碎片自我毁灭set