今天花了大半天去研究ActionBar获取指针为空,fragment嵌套失败等问题,在此做一些总结,以免之后再犯错:
今天主要工作为在atyA中填充fragmentA,而在fragmentA中初始化ActionBar与ViewPager,而ViewPager实现FragmentPagerAdapter来填充内容
分别使用了:
import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity;以上组合能够正常运行
一.为了使用ActionBar,由于Theme.Holo不能使用(待解决),在application中使用@style/AppTheme,它继承在API不同时使用的其实是不同的style.xml文件:
values-v11代表在API 11+的设备上,用该目录下的styles.xml代替res/values/styles.xml,其中API 11+代表android 3.0 +
values-v14代表在API 14+的设备上,用该目录下的styles.xml代替res/values/styles.xml,其中API 14+代表android 4.0 +
二.为了出现ActionBar,最好使用ActionBarActivity,用过demo测试过android.support.v4.app.FragmentActivity无法显示ActionBar,而换成android.support.v7.ActionBarActivity之后可以正常显示。查看源代码后,发现:
android.support.v7.ActionBarActivity(并没有实现额外的方法)继承自android.support.v7.app.AppCompatActivity,
而android.support.v7.app.AppCompatActivity,继承自android.support.v4.app.FragmentActivity,
而android.support.v4.app.FragmentActivity继承自android.app.Activity
其中:Activity实现了getFragmentManager(),而FragmentActivity实现了getSupportFragmentManager(),所以AppCompatActivity与ActionBarActivity使用getSupportFragmentManager会比较合适。
Activity实现了getActionBar(),而AppCompatActivity实现了getSupportActionBar。
三.在Fragment中获取ActionBar:(比如要设计点击对应Tab时,fragment中的viewpager会selected到对应的子fragment,这时候不方便在activity中进行监听,将ActionBar.TabListener接口的实现放在fragment中就挺好。)
ab_main = ((ActionBarActivity)getActivity()).getSupportActionBar();需要将getActivit()获取的引用强制类型转换成ActionBarActivity,否则getSupportActionBar()报错。
个人认为是重写Fragment的onAttach()方法时,绑定的是Activity而不是ActionBarActivity:
public void onAttach(Activity activity) { super.onAttach(activity); }而若使用
ab_main = getActivity().getActionBar();
获取的不是android.support.v7.app.ActionBar而是android.app.ActionBar
四.ViewPager使用FragmentPagerAdapter来填充
由于是在Fragment中对ViewPager进行填充,故需要先使用getActivity()来获取依赖的Activity,再利用getSupportFragmentManager()方法将FragmentManager传入
FragmentMainVpAdapter adapter = new FragmentMainVpAdapter(getActivity().getSupportFragmentManager());以下是FragmentMainVpAdapter.java的主要内容:
其中:FragmentFindInf与FragmentHintInf是ViewPager左右滑动切换时的两个Fragmentpublic class FragmentMainVpAdapter extends FragmentPagerAdapter { public FragmentMainVpAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position){ case 0: return new FragmentFindInf(); case 1: return new FragmentHintInf(); } return null; } @Override public int getCount() { return 2; } }
五.ActionBar与ViewPager的动态效果(*******************************重要*********************************)
为了能实现在点击ActionBar导航栏时ViewPager切换到对应的Fragment上、滑动ViewPager时能选中对应的ActionBar项,需要以下两个关键步骤
由于是在fragment中对ActionBar进行初始化,则这个fragment需要实现ActionBar.TabListener接口:
并重写:
@Override public void onTabSelected(ActionBar.Tab tab, android.support.v4.app.FragmentTransaction ft) { if (vp_main != null) { vp_main.setCurrentItem(tab.getPosition());//VP是VIEWPAGER,点击ActionBar导航栏ViewPager会滑动到对应fragment } } @Override public void onTabUnselected(ActionBar.Tab tab, android.support.v4.app.FragmentTransaction ft) { } @Override public void onTabReselected(ActionBar.Tab tab, android.support.v4.app.FragmentTransaction ft) { }
以及为ViewPager设置监听器:
vp_main.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if(ab_main != null) { ab_main.setSelectedNavigationItem(position);//滑动到不同fragment时,ActionBar上对应导航项目被选中 } } @Override public void onPageScrollStateChanged(int state) { } });以上是今天的一些小结,查了挺多资料,受益匪浅,哈哈。