欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 嵌套Fragment的使用实例代码

程序员文章站 2024-03-06 10:19:19
前言   之前的文章有介绍activitygroup,不少人问嵌套使用的问题,同样的需求在fragment中也存在,幸好在最新的android support...

前言

  之前的文章有介绍activitygroup,不少人问嵌套使用的问题,同样的需求在fragment中也存在,幸好在最新的android support 包已经支持这一特性!这里就跳过fragment的介绍,需要注意的是tabactivity已经被标记为弃用(deprecated)。

正文

 一、准备

  关于最新的android兼容包的介绍,参见官网。可以在android sdk目录下extras/android/support/v13/android-support-v13.jar找到最新版,注意是伴随着android 4.2一起更新的。

  关于嵌套fragment的介绍,参照官网。

二、截图

Android 嵌套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 更新翻译一下,强烈建议大家升级到最新的兼容包。