当前位置: 移动技术网 > 移动技术>移动开发>Android > Android 嵌套Fragment的使用实例代码

Android 嵌套Fragment的使用实例代码

2019年07月24日  | 移动技术网移动技术  | 我要评论
前言   之前的文章有介绍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的介绍,参照官网。

二、截图

 三、代码

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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网