Android - getSupportFragmentManager()。getFragments()。get(activeItem)和getVisibleFragment()返回错误的片段

时间:2016-10-22 10:05:32

标签: android android-fragments

我正在构建这个Android应用程序,我有这个Activity,我有一个ViewPager,托管4个不同的片段。用户可以在这些片段之间滑动并查看其数据。我还有一个菜单,用户可以删除或发送4碎片上显示的记录。

为了弄清楚哪个片段处于活动状态,我运行此代码(来自viewPager所在的Activity):

int activeItem = viewPager.getCurrentItem();
Log.e(TAG, "activeItem = " + activeItem);

Fragment fragment = this.getSupportFragmentManager().getFragments().get(activeItem);
String fragmentName = fragment.getClass().getSimpleName();

Log.e(TAG, "fragment name = " + fragmentName);

if(activeItem == 0) {
    showDialog("Confirm Send", "Would you like to send the checked items?",
            actionSend, RecordsSent, fragment);
}
else{
    showDialog("Confirm Send", "Would you like to send the checked items?",
            actionSend, RecordsPending, fragment);
}

我做的是获取活动项,然后在该索引处获取片段(使用getSupportFragmentManager())。然后根据活动项目的内容,我很清楚Fragment是活跃的。

这已经工作了很长时间,直到我添加了另一个片段,突然之间,我得到了ClassCastException。因为在我的showDialog函数中,我做了类似的事情:

RecordsSent rsFragment = (RecordsSent) fragment;

发生的事情是发送了错误的片段!我的片段是:

RecordsSent RecordsPending RecordsSales RecordsNews

我收到了Class Cast错误,因为我将RecordsPending转换为RecordsSent,反之亦然。然后我用:

列出了我的片段
Log.e(TAG, "fragments = " + this.getSupportFragmentManager().getFragments().toString());

然后它显示了RecordsPending 首先然后是RecordsSent。难怪我得到了ClassCastException。 getCurrentItem返回0,supportFragmentManager中的第0项是RecordsPending 而不是 RecordsSent。

我不知道是什么促使我片段的索引之间切换,这使得这个难题更令人费解。

这是我用来初始化片段的代码。

TextView tv1 = createTab("Sent", new ColorDrawable(Color.parseColor("#006633")));
TextView tv2 = createTab("Pending", new ColorDrawable(Color.parseColor("#CCCC00")));
TextView tv3 = createTab("Daily Sales Report", new ColorDrawable(Color.parseColor("#F7C05F")));
TextView tv4 = createTab("News Records", new ColorDrawable(Color.parseColor("#B72153")));

tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.addTab(tabLayout.newTab().setCustomView(tv1).setTag("Sent"));
tabLayout.addTab(tabLayout.newTab().setCustomView(tv2).setTag("Pending"));
tabLayout.addTab(tabLayout.newTab().setCustomView(tv3).setTag("Sales"));
tabLayout.addTab(tabLayout.newTab().setCustomView(tv4).setTag("News"));
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

//more code here

viewPager = (ViewPager) findViewById(R.id.pager);
adapter = new PagerAdapter (getSupportFragmentManager(), tabLayout.getTabCount());
Log.e(TAG, "tab count = " + tabLayout.getTabCount());
viewPager.setAdapter(adapter);

viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }
});

我的PagerAdapter类看起来像这样:

public class PagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                RecordsSent tab1 = new RecordsSent();
                return tab1;
            case 1:
                RecordsPending tab2 = new RecordsPending();
                return tab2;
            case 2:
                RecordsSales tab3 = new RecordsSales();
                return tab3;
            case 3:
                RecordsNews tab4 = new RecordsNews();
                return tab4;
            default:
                return null;
        }
    }

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

如您所见,第一项是RecordsSent,然后是RecordsPending。我不知道为什么supportFragmentManager返回相反的顺序。

我试过了:

android.support.v4.app.Fragment fragment = getVisibleFragment();
String fragmentName = fragment.getClass().getSimpleName();

但它仍然返回错误的片段类型。

我也尝试在if-else块中执行此操作:

if(activeItem == 0) {
    Log.e(TAG, "fragment is records sent");
    fragment = fm.findFragmentByTag("Sent");

    showDialog(title, message,
            actionDelete, RecordsSent, fragment);

}
else{
    //I use "Pending" here
}

但是,当我强制它时,我得到一个空指针异常。

这个问题真的令人沮丧,因为它是在几天前工作,然后突然间却没有。

0 个答案:

没有答案