15 android android-asynctask android-actionbar-compat android-actionbaractivity
我正在使用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 SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0:
Fragment1 f1 = new Fragment1();
return f1;
case 1:
Fragment2 f2 = new Fragment2();
return f2;
case 2:
Fragment3 f3 = new Fragment3();
return f3;
case 3:
Fragment4 f4 = new Fragment4();
return f4;
case 4:
Fragment5 f5 = new Fragment5();
return f5;
}
return null;
}
@Override
public int getCount() {
// Show 5 total pages.
return 5;
}
}
Run Code Online (Sandbox Code Playgroud)
Fragemnt类代码:
public class F1 extends Fragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
@SuppressLint("NewApi")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.f1,container, false);
Toast.makeText(getActivity(), "F1", Toast.LENGTH_SHORT).show();
return view;
}
}
Run Code Online (Sandbox Code Playgroud)
Lor*_*nMK 13
在FragmentPagerAdapter保持额外的片段,除了所示的一个,在恢复状态.解决方案是实现自定义OnPageChangeListener并为显示片段时创建新方法.
1)创建LifecycleManager接口接口将有两个方法,每个ViewPager’sFragment将实现它.这些方法如下:
public interface FragmentLifecycle {
public void onPauseFragment();
public void onResumeFragment();
}
Run Code Online (Sandbox Code Playgroud)
2)让每个Fragment实现每个类声明的接口Add iplements语句:
public class FragmentBlue extends Fragment implements FragmentLifecycle
public class FragmentGreen extends Fragment implements FragmentLifecycle
public class FragmentPink extends Fragment implements FragmentLifecycle
Run Code Online (Sandbox Code Playgroud)
3)在每个片段中实现接口方法为了检查它是否真的按预期工作,我将只记录方法调用并显示Toast:
@Override
public void onPauseFragment() {
Log.i(TAG, "onPauseFragment()");
Toast.makeText(getActivity(), "onPauseFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
@Override
public void onResumeFragment() {
Log.i(TAG, "onResumeFragment()");
Toast.makeText(getActivity(), "onResumeFragment():" + TAG, Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)
4)在ViewPager页面上调用接口方法更改您可以在ViewPager上设置OnPageChangeListener,并在每次ViewPager显示另一个页面时获取回调:
pager.setOnPageChangeListener(pageChangeListener);
Run Code Online (Sandbox Code Playgroud)
5)实现OnPageChangeListener以调用自定义生命周期方法
监听器知道新位置,并可以在PagerAdapter的帮助下调用新Fragment上的接口方法.我可以在这里调用onResumeFragment()来获取当前新片段和onPauseFragment().
我还需要存储当前片段的位置(最初当前位置等于0),因为我不知道用户是从左向右还是从右向左滚动.看看我在代码中的意思:
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
int currentPosition = 0;
@Override
public void onPageSelected(int newPosition) {
FragmentLifecycle fragmentToShow = (FragmentLifecycle)pageAdapter.getItem(newPosition);
fragmentToShow.onResumeFragment();
FragmentLifecycle fragmentToHide = (FragmentLifecycle)pageAdapter.getItem(currentPosition);
fragmentToHide.onPauseFragment();
currentPosition = newPosition;
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) { }
public void onPageScrollStateChanged(int arg0) { }
};
Run Code Online (Sandbox Code Playgroud)
我没有写代码.完整的教程:http://looksok.wordpress.com/2013/11/02/viewpager-with-detailed-fragment-lifecycle-onresumefragment-including-source-code/
| 归档时间: |
|
| 查看次数: |
3848 次 |
| 最近记录: |