博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Andorid X 项目笔记】嵌套Fragment的使用(5)
阅读量:6070 次
发布时间:2019-06-20

本文共 5761 字,大约阅读时间需要 19 分钟。

前言

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

你可能感兴趣的文章
mysql5.7 创建一个超级管理员
查看>>
【框架整合】Maven-SpringMVC3.X+Spring3.X+MyBatis3-日志、JSON解析、表关联查询等均已配置好...
查看>>
要想成为高级Java程序员需要具备哪些知识呢?
查看>>
带着问题去学习--Nginx配置解析(一)
查看>>
onix-文件系统
查看>>
java.io.Serializable浅析
查看>>
我的友情链接
查看>>
多线程之线程池任务管理通用模板
查看>>
CSS3让长单词与URL地址自动换行——word-wrap属性
查看>>
CodeForces 580B Kefa and Company
查看>>
开发规范浅谈
查看>>
Spark Streaming揭秘 Day29 深入理解Spark2.x中的Structured Streaming
查看>>
鼠标增强软件StrokeIt使用方法
查看>>
本地连接linux虚拟机的方法
查看>>
某公司面试java试题之【二】,看看吧,说不定就是你将要做的题
查看>>
BABOK - 企业分析(Enterprise Analysis)概要
查看>>
Linux 配置vnc,开启linux远程桌面
查看>>
NLog文章系列——如何优化日志性能
查看>>
Hadoop安装测试简单记录
查看>>
CentOS6.4关闭触控板
查看>>