前言 之前的文章有介绍ActivityGroup,不少人问嵌套使用的问题,同样的需求在Fragment中也存在,幸好在最新的Android support 包已经支持这一特性!这里就跳过Fragment的介绍,需要注意的是TabActivity已经被标记为弃用(deprecated)。
正文 一、准备
关于最新的Android兼容包的介绍,参见官网。可以在android sdk目录下extras/android/support/v13/android-support-v13.jar找到最新版,注意是伴随着Android 4.2一起更新的。
关于嵌套Fragment的介绍,参照官网。
二、截图
三、代码 FragmentNestActivity.javaimport android.graphics.Color;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentStatePagerAdapter;import android.support.v4.app.FragmentTransaction;import android.support.v4.view.ViewPager;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.TextView;/** * 嵌套Fragment使用 ** @author 农民伯伯 * @see http://www.cnblogs.com/over140/archive/2013/01/02/2842227.html **/public class FragmentNestActivity extends FragmentActivity implements OnClickListener {@Overrideprotected void onCreate(Bundle arg0) {super.onCreate(arg0);setContentView(R.layout.nested_fragments);findViewById(R.id.btnModule1).setOnClickListener(this);findViewById(R.id.btnModule2).setOnClickListener(this);findViewById(R.id.btnModule3).setOnClickListener(this);findViewById(R.id.btnModule1).performClick();}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btnModule1:addFragmentToStack(FragmentParent.newInstance(0));break;case R.id.btnModule2:addFragmentToStack(FragmentParent.newInstance(1));break;case R.id.btnModule3:addFragmentToStack(FragmentParent.newInstance(2));break;}}private void addFragmentToStack(Fragment fragment) {FragmentTransaction ft = getSupportFragmentManager().beginTransaction();//ft.setCustomAnimations(android.R.anim.slide_in_left, android.R.anim.slide_in_left);ft.replace(R.id.fragment_container, fragment);ft.commit();}/** 嵌套Fragment */public final static class FragmentParent extends Fragment {public static final FragmentParent newInstance(int position) {FragmentParent f = new FragmentParent();Bundle args = new Bundle(2);args.putInt("position", position);f.setArguments(args);return f;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View convertView = inflater.inflate(R.layout.viewpager_fragments, container, false);ViewPager pager = (ViewPager) convertView.findViewById(R.id.pager);final int parent_position = getArguments().getInt("position");//注意这里的代码pager.setAdapter(new FragmentStatePagerAdapter(getChildFragmentManager()) {@Overridepublic Fragment getItem(final int position) {return new Fragment() {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {TextView convertView = new TextView(getActivity());convertView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));convertView.setGravity(Gravity.CENTER);convertView.setTextSize(30);convertView.setTextColor(Color.BLACK);convertView.setText("Page " + position);return convertView;}};}@Overridepublic int getCount() {return 3;}@Overridepublic CharSequence getPageTitle(int position) {return "Page " + parent_position + " - " + position;}});return convertView;}}}
代码说明: 这里最关键的是方法getChildFragmentManager的支持。这里也演示了Fragment作为嵌套内部类的使用方法。
nested_fragments.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" ><FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="fill_parent"android:layout_height="0dip"android:layout_weight="1.0"android:background="#F7F5DE" ></FrameLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="bottom"android:background="@android:color/black"android:orientation="horizontal" ><ImageViewandroid:id="@+id/btnModule1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="3dp"android:layout_marginLeft="7dp"android:layout_marginTop="3dp"android:src="@android:drawable/ic_dialog_dialer" /><ImageViewandroid:id="@+id/btnModule2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="3dp"android:layout_marginLeft="7dp"android:layout_marginTop="3dp"android:src="@android:drawable/ic_dialog_info" /><ImageViewandroid:id="@+id/btnModule3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="3dp"android:layout_marginLeft="7dp"android:layout_marginTop="3dp"android:src="@android:drawable/ic_dialog_alert" /></LinearLayout></LinearLayout>
viewpager_fragments.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.support.v4.view.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v4.view.PagerTitleStripandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="top" /></android.support.v4.view.ViewPager></LinearLayout>
代码说明: 注意!实践发现ViewPager并不能作为顶层容器,否则会报错。
四、说明 这是一个典型的嵌套Fragment的例子,最外层使用FrameLayout来实现几大模块的切换,内部使用ViewPager实现子模块的切换,非常实用。
结束 考虑把Support Package, revision 11 更新翻译一下,强烈建议大家升级到最新的兼容包。