【Andorid X 项目笔记】嵌套Fragment的使用(5)

前言

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

 

声明
欢迎转载,但请保留文章原始出处:)
博客园:http://www.cnblogs.com
农民伯伯: http://www.cnblogs.com/over140/ 

 

正文

一、准备

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

转载:http://www.cnblogs.com/over140/archive/2013/02/18/2842227.html

时间: 2024-10-05 08:15:39

【Andorid X 项目笔记】嵌套Fragment的使用(5)的相关文章

【Andorid X 项目笔记】动态设置ViewPager的Adapter问题(2)

声明 欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com     正文 由于没有找到嵌套FragmentActivity的方法,只好打算用不同的FragmentPagerAdapter来动态切换ViewPager的,如下:       /**      * 首页切换的三个界面      */     private FragmentPagerAdapter mPagerAdapter1 = 

android5.1手机项目中使用fragment,调用拍照onactivityresult无反应

问题描述 android5.1手机项目中使用fragment,调用拍照onactivityresult无反应 android5.1手机项目中使用fragment,调用拍照onactivityresult点击保存不会调用,但是点击取消能调用onactivityresult,android4.4以下的可以,求哪个大神帮下忙 解决方案 应该还是你的方法不对,换一个Intent试试,android提供的Intent有多种,我之前用的方法都测试过,都可以,刚还帮你测了一次5.1,没啥问题. 解决方案二:

UWP开发笔记——嵌套式页面的实现

原文:UWP开发笔记--嵌套式页面的实现 绪论 UWP开发中,Page是最常用的Control之一,通常情况下,在开发的application中,每一个页面就是一个Page.有时候,为了开发整合度更高,UI表现更为一致的UI,开发者需要把UI控件和功能整合到一个页面的子页面中,子页面拥有自己的UI表现和生命周期,这就需要在Page中嵌套Page来达到需要实现的效果. 一种实现方法 其实,实现嵌套页面是一件很简单的事情,我们知道,page都是通过Frame显示和控制Navigation的,基于这点

急急急急 fragment嵌套fragment+viewpager缓存 !在线等!

问题描述 急急急急 fragment嵌套fragment+viewpager缓存 !在线等! 点击首页之后在跳回这个页面数据会重新加载 状态没有保存 使用setOffscreenPageLimit没有用 在线等谢谢 解决方案 有用过不行.... 我现在准备用生命周期来试试 解决方案二: 缓存你的fragment试图http://www.tuicool.com/articles/FJ7VBb 解决方案三: 有用过不行.... 我现在准备用生命周期来试试 解决方案四: 缓存fragmen视图

《BI项目笔记》用Excel2013连接和浏览OLAP多维数据集

原文:<BI项目笔记>用Excel2013连接和浏览OLAP多维数据集 用Excel2013连接和浏览OLAP多维数据集

《BI项目笔记》——微软BI项目笔记连载

原文:<BI项目笔记>--微软BI项目笔记连载 本系列文章主要是结合实际项目,加上自己的总结,整理出来的一系列项目笔记,涉及微软SQL Server2008中商务智能开发中的SSAS.SSIS模块:  准备工作: <BI项目笔记>基于雪花模型的维度设计 <BI项目笔记>数据源视图设置 <BI项目笔记>创建标准维度.维度自定义层次结构 <BI项目笔记>创建父子维度 <BI项目笔记>创建时间维度(1) <BI项目笔记>创建时间

《BI项目笔记》SSAS部署时发生的问题——元数据管理器中存在错误 解决办法

原文:<BI项目笔记>SSAS部署时发生的问题--元数据管理器中存在错误 解决办法 在生成和部署期间出错.是否继续?解决办法: 用Microsoft SQL Server Management Studio 连接Analysis Services 然后删除多维数据库,重新布署.这样就OK的.

项目笔记---CSharp图片处理

原文:项目笔记---CSharp图片处理 项目笔记---CSharp图片处理   最近由于项目上需要对图片进行二值化处理,就学习了相关的图片处理上的知识,从开始的二值化的意义到动态阀值检测二值化等等,并用C#得以应用,学到了很多的知识和大家分享下我个人的经验,希望对大家有帮助.   二值化 二值化简而言之是对一副彩色图片进行0/1运算,最终显示一副黑白相间的图片,其意义多数在于对二值化处理后的图片进行分割识别,一些自动识别的验证码工具大多是先进行二值化,然后在模式识别,最终推断出验证码:我的项目

android-fragment怎么嵌套fragment

问题描述 fragment怎么嵌套fragment 我弄了一个fragment,底部有3个页面,在第一个页面再加fragment做一个顶部的滑动导航,可是加了顶部导航的代码之后,底部第一个页面的replace.add.show都出错了,应该怎么办!! 解决方案 多个Fragment嵌套关于Fragment嵌套的一些坑Android之Fragment的嵌套布局---------------------- 解决方案二: fragment内部放置一个viewpager,viewpager里面放frag