问题:片段onResume()在ViewPager片段实际可见之前被触发.
例如,我有2个片段与ViewPager和FragmentPagerAdapter.第二个片段仅供授权用户使用,我需要让用户在片段可见时登录(使用警告对话框).
但是ViewPager当第一个片段可见时创建第二个片段,以便缓存第二个片段,并在用户开始滑动时使其可见.
因此,onResume()事件在第二个片段变为可见之前就被触发了.这就是为什么我试图找到一个事件,当第二个片段变得可见时,它会在适当的时刻显示一个对话框.
如何才能做到这一点?
我正在使用ActionBarActivity创建5个选项卡.我使用ViewPager在SectionsPagerAdapter中使用扩展FragmentPagerAdapter在5个选项卡之间滑动.每个选项卡都有一个带有asynctask的片段,在oncreateview方法中调用.当我在一个片段中时,正在调用其他片段中的asynctask.
我尝试在oncreateview方法中使用toast消息是每个片段而不是asynctask.但错误的片段中错误的吐司消息被触发了.
Oncreate方法代码:
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.pager_exp);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position)
{
actionBar.setSelectedNavigationItem(position);
actionBar.setTitle(getHomePageTitle(position));
}
});
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++)
{
// Create a tab with text corresponding to the page title defined by
// the adapter. Also specify this Activity object, which implements
// the TabListener interface, as the callback (listener) for when
// this tab is selected.
actionBar.addTab(actionBar.newTab()
.setIcon(getPagedrawable(i))
.setTabListener(this));
}
Run Code Online (Sandbox Code Playgroud)
//适配器类代码:
public class …Run Code Online (Sandbox Code Playgroud) android android-asynctask android-actionbar-compat android-actionbaractivity
问题:
我目前遇到一个问题,我的应用程序在首次打开时尝试加载太多片段。
我有BottomNavigationView与ViewPager该负载4个片段-的每一个Fragment包含TabLayout与ViewPager负载至少 2个片段。
可以想象,这是很多UI渲染(10多个片段)的-特别是当其中一些片段包含繁重的组件(如日历,条形图等)时。
当前提出的解决方案:
在需要片段时控制UI加载-因此,直到用户第一次访问该片段,才有理由加载它。
似乎肯定有可能,包括Play商店在内的许多应用都在这么做。请在此处查看示例
在上面的视频示例中-导航到选项卡后,正在加载UI组件。它甚至具有嵌入式的加载符号。
1)我试图弄清楚该怎么做-在什么时候我知道需要创建该片段UI还是已经创建了它?
2)另外,我将在其中启动UI创建过程的片段生命周期回调是什么?onResume()表示用户界面对用户可见,因此加载用户界面会很漫长和延迟。
希望这足够清楚。
编辑:
我已经在使用FragmentStatePagerAdapteras ViewPager适配器。我注意到super(fm)构造器中的方法现在已被弃用:
ViewPagerAdapter(FragmentManager fm) {
super(fm); // this is deprecated
}
Run Code Online (Sandbox Code Playgroud)
所以我将其更改为:
ViewPagerAdapter(FragmentManager fm) {
super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
}
Run Code Online (Sandbox Code Playgroud)
BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT:指示仅当前片段将处于Lifecycle.State.RESUMED状态。所有其他片段的上限为Lifecycle.State.STARTED。
这似乎是有用的作为onResume()的Fragment时候才会被称为Fragment是对用户可见。可以通过某种方式使用此指示加载UI吗?