当前位置: 首页 > 知识库问答 >
问题:

在FragmentStatePagerAdapter中导航时清除片段

汪阳飇
2023-03-14

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

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

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

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

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

碎片雷达

公共类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,我之所以这样做是因为我一直在发送这样的广播:

在视图Pager.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);
                }
            }
        }

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

我希望有人能帮我解决这个问题。

共有1个答案

松高爽
2023-03-14

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

通过设置ViewPager的OffscreenPagliemit,可以避免此问题。默认限制为2,但我有3个片段,因此每次都会重新创建位置为0的片段。因此,解决办法是:

viewpager.setOffscreenPageLimit(2);

来源:Android:FragmentPagerAdapter不保存片段的状态?

当然要感谢那些帮助我的人。

 类似资料:
  • 我正在使用android中的新导航架构组件,在移动到一个新的片段后,我被困在清除导航堆栈中。 示例:我在loginFragment中,当我导航到home片段时,我希望该片段从堆栈中清除,这样当用户按下back按钮时,他就不会返回到loginFragment。 我正在使用一个简单的navhostfragment.findnavcontroller(Fragment).navigate(r.id.ho

  • 问题内容: 我有4页。 从第1页>第2页>第3页>第4页。 用户到达page_3并单击按钮后,它将导航到page_4。单击该按钮后,我想清除所有导航历史记录,以便当用户返回page_4时,该应用程序退出而不是返回至page_3。 我试过了: 但是什么也没发生。我仍然可以返回page_3,page_2等。如何做到这一点,以便当用户单击page_3上的按钮时,他可以转到page_4,而从page_4不

  • 我遇到的问题是,我需要完全删除中保存的一些。 我已经对它进行了修复,但是旧的片段似乎仍然完好无损。 建筑施工

  • 我正在使用Android中新的导航架构组件。我有三个片断,逻辑片断,主片断,解决片断。主机片段是LoginFragment,登录成功时转到MainFragment,在MainFragment中转到SettingFragment,注销转到LoginFragment。

  • 我已经从连接到NavController的导航抽屉中导航到了DialogFragment。但当我导航到另一个目标时,我已经将弹出窗口设置为包含对话框片段,但它并没有清除堆栈。如何清除堆栈? AM从LogoutDialog调用此方法 我只使用片段和一个活动。 这是我导航图的一部分

  • 我是Android Jetpack导航架构的新手。我正在一个新应用程序上试用它。有一个活动和一些片段,其中两个是登录屏幕和电子邮件登录屏幕。我在我的导航XML中定义了这些片段。应用程序的流程如下: 登录屏幕→ <代码>电子邮件登录屏幕 我想要的是,在导航到电子邮件登录屏幕后,当我向后按时,应用程序退出。这意味着登录屏幕的后堆栈被删除了。我知道登录屏幕不应该这样工作,但我仍然只是在解决问题。 我遵循