今儿在项目中遇到个问题,分析了下采用Fragment解决。
1.问题描述:
如图所示,在页面顶部有4个tab要求支持切换,以及页面滑动时tab切换。
2.解决方案分析
2.1 tab切换:为了让每一个tab页都有一个完整的生命周期,决定采用Fragment去编写。
2.2 滑动切换:ViewPagger
3.解决方法
3.1 主容器
task_add_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" >
<!--<android.support.v4.view.PagerTabStrip-->
<!--android:layout_width="wrap_content"-->
<!--android:layout_height="wrap_content"-->
<!--android:layout_gravity="top" />-->
</android.support.v4.view.ViewPager>
</LinearLayout>
TaskAddActivity.java
public class TaskAddActivity extends FragmentActivity {
private final String TAG = TaskAddActivity.class.getSimpleName();
/**
* 所持有的Fragments
*/
List<Fragment> fragmentList = new ArrayList<Fragment>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.task_add_activity);
ViewPager vp = (ViewPager)findViewById(R.id.viewPager);
fragmentList.add(new TaskAddSimpleFragment());
fragmentList.add(new TaskAddDetailFragment());
vp.setAdapter(new TaskTabsAdapter(getSupportFragmentManager(), fragmentList));
vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float v, int i1) {
}
@Override
public void onPageSelected(int position) {
Log.i(TAG, "onPageSelected no:" + position);
// TODO 做TAB切换的监听
}
@Override
public void onPageScrollStateChanged(int position) {
}
});
}
/**
* 定义适配器
*
* @author trinea.cn 2012-11-15
*/
class TaskTabsAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public TaskTabsAdapter(FragmentManager fm, List<Fragment> fragmentList){
super(fm);
this.fragmentList = fragmentList;
}
/**
* 得到每个页面
*/
@Override
public Fragment getItem(int position) {
return (fragmentList == null || fragmentList.size() == 0) ? null : fragmentList.get(position);
}
/**
* 每个页面的title
@Override
*/public CharSequence getPageTitle(int position) { return ""; } /** * 页面的总个数 */ @Override public int getCount() { return fragmentList == null ? 0 : fragmentList.size(); } }}
3.2 tab页
为了简洁,这里只列举一个tab,另外的类似
text_fragment.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/viewPagerText"
android:text="adfssdfa"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
TaskAddSimpleFragment.java
public class TaskAddSimpleFragment extends Fragment {
private TextView tv;
public TaskAddSimpleFragment() {
super();
}
/**
* 覆盖此函数,先通过inflater inflate函数得到view最后返回
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.text_fragment, container, false);
tv = (TextView) v.findViewById(R.id.viewPagerText);
tv.setText("添加任务精简版");
return v;
}
}
当然,请记得导入android-support-v4.jar