前言
之前的文章有介绍ActivityGroup,不少人问嵌套使用的问题,同样的需求在Fragment中也存在,幸好在最新的Android support 包已经支持这一特性!这里就跳过Fragment的介绍,需要注意的是TabActivity已经被标记为弃用(deprecated)。
正文
一、准备
关于最新的Android兼容包的介绍,参见官网。可以在android sdk目录下extras/android/support/v13/android-support-v13.jar找到最新版,注意是伴随着Android 4.2一起更新的。
关于嵌套Fragment的介绍,参照官网。
二、截图
三、代码
FragmentNestActivity.java
import 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 { @Override protected 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(); } @Override public 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; } @Override public 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()) { @Override public Fragment getItem(final int position) { return new Fragment() { @Override public 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; } }; } @Override public int getCount() { return 3; } @Override public 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\" > <FrameLayout android:id=\"@+id/fragment_container\" android:layout_width=\"fill_parent\" android:layout_height=\"0dip\" android:layout_weight=\"1.0\" android:background=\"#F7F5DE\" > </FrameLayout> <LinearLayout android:layout_width=\"fill_parent\" android:layout_height=\"wrap_content\" android:layout_gravity=\"bottom\" android:background=\"@android:color/black\" android:orientation=\"horizontal\" > <ImageView android: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\" /> <ImageView android: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\" /> <ImageView android: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.ViewPager android:id=\"@+id/pager\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\" > <android.support.v4.view.PagerTitleStrip android: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 更新翻译一下,强烈建议大家升级到最新的兼容包。
本文地址:https://www.stayed.cn/item/21337
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我