【问题标题】:Fragment is cleared when navigated in FragmentStatePagerAdapter在 FragmentStatePagerAdapter 中导航时清除 Fragment
【发布时间】:2015-02-28 16:20:11
【问题描述】:

我有一个包含 FragmentStatePagerAdapter 的活动,在这个 FragmentStatePagerAdapter 中有三个片段。或者,当调用正确的 getItem() 时,它们会被启动。

活动执行数据密集型任务,并在完成时发送广播。我已经在 FragmentStatePagerAdapter 的每个片段中注册了一个广播接收器。

现在这一切都很好,除了一件事:

  • 当我们滚动到位置 2 的片段时(位置 1 和 2 正常工作)位置 0 的片段被清除并且不会 返回。

以下是我的一些代码示例:

FragmentStatePagerAdapter

公共类 MessagePagerAdapter 扩展 FragmentStatePagerAdapter {

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

@Override
public Fragment getItem(int arg0) {
    if(arg0 == 0) {
        Fragment fragment = new RecentConversationFragment();
        return fragment;
    } else if(arg0 == 1) {
        Fragment fragment = new PrivateConversationFragment();
        return fragment;
    } else {
        Fragment fragment = new ClanConversationFragment();
        return fragment;
    }
}

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


@Override
public CharSequence getPageTitle(int position) {
    if(position == 0) {
        return "Recent";
    } else if(position == 1) {
        return "Private";
    } else {
        return "Clan";
    }
}

活动的相关部分

收到数据后,我会广播一个意图

Intent recentIntent = new Intent("MESSAGE_LOADER_RECENT");
MessageActivity.this.sendBroadcast(recentIntent);

这个广播在我的片段中是这样接收的:

private void createReceiver() {
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("MESSAGE_LOADER_RECENT");
    receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            fetchMessages();
        }
    };

    getActivity().getApplicationContext().registerReceiver(receiver,
            intentFilter);

}

private void fetchMessages() {
    this.conversations = mActivity.getRecentPrivateConversations();
    messageListView.setAdapter(new ConversationListAdapter(mActivity,
            R.layout.conversation_row, conversations));
    messageListView.setDivider(null);
    messageListView.setDividerHeight(0);
    mActivity.recentConversationBroadcastReceived = true;
    messageListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            mActivity.navigateToConversation(conversations.get(position));
        }
    });

}

注意我设置了mActivity.recentConversationBroadcastReceived = true,我这样做是因为我一直这样发送广播:

在viewPager.setOnPageChangeListener中,

        @Override
        public void onPageSelected(int arg0) {
            //here we check whether a broadcast is already sent to the
            //specific fragment, if not we need to send one
            if (arg0 == 0 || arg0 == 1) {
                // recent or private
                if (MessageActivity.this.loadedConversations != null) {
                    // check if the fragment already received a broadcast
                    if (arg0 == 0 && !recentConversationBroadcastReceived) {
                        Intent intent = new Intent("MESSAGE_LOADER_RECENT");
                        MessageActivity.this.sendBroadcast(intent);
                    } else if (arg0 == 1
                            && !privateConversationBroadcastReceived) {
                        Intent intent = new Intent("MESSAGE_LOADER_PRIVATE");
                        MessageActivity.this.sendBroadcast(intent);
                    }
                }
            } else {
                // clan
                if (!clanConversationBroadcastReceived
                        && MessageActivity.this.loadedClanConversations != null) {
                    Intent intent = new Intent("MESSAGE_LOADER_CLAN");
                    MessageActivity.this.sendBroadcast(intent);
                }
            }
        }

我这样做是因为当我发送广播时,不能保证当前活动的片段是实际使用数据的片段,并且片段可能不会被启动。所以我会在每次页面更改时发送一个广播,直到收到为止。

我希望有人可以帮助我解决这个问题。

【问题讨论】:

    标签: android android-fragments broadcastreceiver fragmentstatepageradapter


    【解决方案1】:

    呃。我讨厌回答自己的问题。

    这个问题可以通过设置ViewPager的offScreenPageLimit来避免。默认限制是 2,但我有 3 个片段,所以这就是为什么每次都重新创建位置 0 的片段。所以解决方案是:

    viewpager.setOffscreenPageLimit(2);
    

    来源:Android : FragmentPagerAdapter don't saved the state of Fragment?

    当然要感谢帮助过我的人。

    【讨论】:

    • 默认限制是1,所以你设置ViewPager.setOffscreenPageLimit(2)就够了
    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多