在活动中访问TabLayout的片段

时间:2017-12-04 20:29:01

标签: android android-fragments android-tablayout fragment-backstack

我试图访问活动中的片段标记,通过触发一个方法(refreshData)来执行该特定片段中的某些逻辑。由于片段属于Tablayout,我完全可以完成坚持如何访问我的活动下的片段。 以下是代码段:

   private void updateFragment(Intent intent){
        FragmentManager manager = getSupportFragmentManager();
        for (int i = 0; i < manager.getBackStackEntryCount(); i++) {
            if (MyFragment.class.getName().equalsIgnoreCase(manager.getBackStackEntryAt(i).getName())) {
                MyFragment currentFragment = (MyFragment)manager.findFragmentByTag(manager.getBackStackEntryAt(i).getName());
                currentFragment.refreshData(intent);
                break;
            }
        }
    }

以下方式我在TabLayout

下创建了两个片段
 @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    MyFragment newsFragment = new MyFragment();

                    return newsFragment;

                case 1:
                    return new MySecondFragment();
            }
            return null;
        }

2 个答案:

答案 0 :(得分:0)

您应该只为每个片段创建一个对象,例如

<!DOCTYPE html>
<html>

<head>
    <style>
        .floating-box {
            display: inline-block;
            width: 150px;
            height: 75px;
            margin: 10px;
            border: 3px solid #73AD21;
        }

        .after-box {
            clear: left;
            border: 3px solid red;
        }

        .player
    </style>
</head>
<script>
    var has_been_played = 0;

    function playSound() {
        var aud=new Audio(file);
        aud.play();
        var b1 = document.getElementbyId("box" + num);
        var b1.has_been_played == true;

    }

    var b1.has_been_played = pauseAud() {
        document.getElementById("box" + num).setAttribute("onClick",
            "javascript: pauseAud();");
    }

    function pauseAud() {
        var aud=new Audio(file);

        aud.pause();
    }
</script>

<body>
    <div id="box1" class="floating-box" onclick="playSound('donttalk.mp3');"></div>
    <div id="box2" class="floating-box" onclick="playSound('goodvibrations.mp3');"></div>
</body>

</html>

然后根据适配器的位置,您可以访问这些片段的MyFragemnt newsFragment; MySecondFragment secondFragemnt; @Override public Fragment getItem(int position) { switch (position) { case 0: if(newsFragment == null) newsFragment = new MyFragment(); return newsFragment; case 1: if(secondFragemnt== null) secondFragemnt= new MySecondFragment(); return secondFragemnt; } return null; }

refreshData()

希望这会有所帮助。

答案 1 :(得分:0)

我倾向于使用ArrayList方法来存储Fragment引用。这项工作的关键是instantiateItem(ViewGroup container, int position)。这可能是PagerAdapter中最重要的方法,因为它负责在配置更改时重新附加片段。如果它没有在内存中找到片段,它只会调用getItem(int position)。通过实现此方法并将重新附加的片段放入ArrayList,配置更改后,您将在列表中拥有相同的片段。

public class SomePagerAdapter extends FragmentPagerAdapter {

        private ArrayList<Fragment> fragments = new ArrayList<>(4);

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

        @Override
        public Fragment getItem(int position) {
            switch (position){
                case 0:
                    return FirstFragment.newInstance();
                case 1:
                    return SecondFragment.newInstance();;
                default:
                    return new Fragment();
            }
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Fragment fragment = (Fragment) super.instantiateItem(container, position);
            fragments.add(fragment);
            return fragment;
        }

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

        public ArrayList<Fragment> getFragments() {
            return fragments;
        }
    }

您可以使用上面的代码:

if(pagerAdapter.getFragments.get(whateverPosition) instanceof FirstFragment {
      ((FirstFragment)pagerAdapter.getFragments().get(whateverPosition)).refreshData(intent);
}

如果您始终确定要访问的内容,则不需要检查instanceof,我只是希望确保我访问的内容符合我的预期。

另一个答案将一直有效,直到配置发生变化。之后你会发现自己引用了一个全新的片段,这可能与你预期的不同。

另请注意,由于系统使用Fragment的构造方式,最佳做法是使用newInstance静态方法实例化Fragment。您可以通过newInstance()传递任何您无法使用构造函数执行的操作。