首页 > 系统 > Android > 正文

Android 嵌套Fragment的使用实例代码

2019-12-12 05:54:39
字体:
来源:转载
供稿:网友

前言

  之前的文章有介绍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 更新翻译一下,强烈建议大家升级到最新的兼容包。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表