android - 使用viewpager时如何与fragment通信?

标签 android android-fragments android-viewpager

我目前正在使用具有“swipey-tabs”并使用以下 PagerAdapter 的应用程序:

public class TabsPagerAdapter extends FragmentPagerAdapter {

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


    @Override
    public Fragment getItem(int index) {
        switch (index) {
            case 0:
                return new HomeFragment();
            case 1:
                return new ListFragment();
            case 2:
                return new ChartFragment();
        }

        return null;
    }

    @Override
    public int getCount() {

        return 3;
    }

}

我正在使用以下代码与主要 Activity 中的一个 fragment 进行通信:

   @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == 1)
        {
            if (resultCode == Activity.RESULT_OK)
            {
                String className = data.getExtras().getString("class_name");
                if (className.trim().length() > 0) {
                    HomeFragment homeFrag = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.home_fragment);
                    if(homeFrag != null) {
                        Log.d("MainActivity", "homeFrag is not null");
                        homeFrag.newClass(className);
                    }else{
                        Log.d("MainActivity", "homeFrag is null");
                        HomeFragment newFragment = new HomeFragment();

                        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                        transaction.replace(R.id.home_fragment, newFragment);
                        transaction.commit();
                        newFragment.newClass(className);
                    }
                    addSubjectToDataBase(className);
                }

            }
        }
    }

我的问题是,当我尝试与主要 Activity 的 fragment 通信时,我似乎同时存在多个 fragment 。当我改变屏幕的方向或重新启动 Activity 时,我得到了 fragment 的修改版本,但是当我来回滑动以查看 fragment 时,我得到了 fragment 的旧的、未修改的版本。 fragment 管理器似乎没有注册适配器创建的 fragment ,因为虽然我知道 fragment 已经创建,但 fragment 管理器总是返回一个空的主 fragment 。

我应该如何避免这个问题,与主要 Activity 的 fragment 通信的最佳方式是什么?

最佳答案

看完this post我为自己的问题制定了解决方案。问题在于,由于 FragmentPagerAdapter 管理自己的 fragment ,因此我尝试访问的 fragment 与 View 寻呼机使用的 fragment 不同。

我通过修改我的 PagerAdapter 找到了一种访问 View 寻呼机使用的 fragment 标签的方法:

public class TabsPagerAdapter extends FragmentPagerAdapter {

    protected String homeTag;
    protected String listTag;
    protected String chartTag;

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

    @Override
    public Fragment getItem(int index) {
        switch (index) {
            case 0:
                Log.d("Adapter", "returning new homeFragment");
                return new HomeFragment();
            case 1:
                return new ListFragment();
            case 2:
                return new ChartFragment();
        }

        return null;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment createdFragment = (Fragment) super.instantiateItem(container, position);

        switch (position){
            case 0:
                homeTag = createdFragment.getTag();
                break;
            case 1:
                listTag = createdFragment.getTag();
                break;
            case 2:
                chartTag = createdFragment.getTag();
                break;
        }

        return createdFragment;
    }

    public String getHomeTag(){
        return  homeTag;
    }

    public String getListTag(){
        return listTag;
    }

    public String getChartTag(){
        return chartTag;
    }
    @Override
    public int getCount() {

        return 3;
    }

}

然后,在我访问了正确的 fragment 标签后,修改我的代码以访问正确的 fragment 是一件简单的事情:

HomeFragment homeFrag = (HomeFragment) getSupportFragmentManager().findFragmentByTag(mAdapter.getHomeTag());
                    if(homeFrag != null) {
                        Log.d("MainActivity", "homeFrag is not null");
                        homeFrag.newClass(className);
                    }else{
                        Log.d("MainActivity", "homeFrag is null");
                        HomeFragment newFragment = new HomeFragment();

                        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                        transaction.replace(R.id.pager, newFragment, madapter.get);
                        transaction.commit();
                        newFragment.newClass(className);

关于android - 使用viewpager时如何与fragment通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499164/

相关文章:

android - 如何测试我们是否在 Gradle 中进行发布构建

Android google+登录 fragment

android - 如何知道 viewpager 是向左还是向右滚动?

Android从网络加载图像到viewpager

每小时运行一次的 Android 服务,从 Webservice 获取数据并更新 localStorage webview chromeclinet

android - 如何创建在应用程序关闭时也能正常工作的 Flutter 后台服务

android - 无法解析方法 'managedQuery"

带有卡片堆栈的 Android 垂直 View 寻呼机

android - 通过 BroadcastReceiver 替代 FileObserver?

android - 适用于 Android 的可扩展(月 View )/可折叠(周 View )日历小部件