我有一个包含FragmentStatePagerAdapter的活动在这个FragmentStatePagerAdapter中有三个片段。或者,当调用适当的getItem()时,它们会被启动。
该活动执行数据密集型任务,完成后发送广播。我已经在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
,我之所以这样做是因为我一直在发送这样的广播:
在视图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);
}
}
}
我这样做是因为当我发送广播时,不能保证当前活动片段就是实际使用数据的片段,并且片段可能不会被启动。因此,我在每次页面更改时发送广播,直到收到为止。
我希望有人能帮我解决这个问题。
啊。我讨厌回答我自己的问题。
通过设置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中定义了这些片段。应用程序的流程如下: 登录屏幕→ <代码>电子邮件登录屏幕 我想要的是,在导航到电子邮件登录屏幕后,当我向后按时,应用程序退出。这意味着登录屏幕的后堆栈被删除了。我知道登录屏幕不应该这样工作,但我仍然只是在解决问题。 我遵循