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

简介:

一、准备

关于最新的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实现子模块的切换,非常实用。 

本文转自博客园农民伯伯的博客,原文链接:【Andorid X 项目笔记】嵌套Fragment的使用(5),如需转载请自行联系原博主。


目录
相关文章
|
4月前
|
XML Java Android开发
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)
39 0
|
4月前
|
XML Java Android开发
Android Studio App开发之碎片Fragment的讲解及实战(附源码 包括静态和动态注册)
Android Studio App开发之碎片Fragment的讲解及实战(附源码 包括静态和动态注册)
42 1
|
4月前
|
XML Java Android开发
Android Studio App开发之列表类视图中基本适配器BaseAdapter的使用及实战(附源码 超详细)
Android Studio App开发之列表类视图中基本适配器BaseAdapter的使用及实战(附源码 超详细)
46 0
|
4月前
|
XML Java Android开发
Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)
Android Studio App自定义控件中视图的构造和测量方法讲解及实战(附源码 实现下拉刷新功能 超详细必看)
41 1
|
8月前
|
Java Android开发
HarmonyOS组件开发 ScrollView嵌套ListContainer 滑动冲突问题
就ScrollView嵌套ListContainer的滑动问题,社区问答中也是遇见了两次提问的小伙伴。在帮助第一个小伙解决这个问题的时候,我提供了一个思路和以前在写Android ScrollView嵌套ListView滑动问题的解决方法。经过方法的修改也是解决了他的问题,后续没有再把这个问题解决的全过程记录下来,直到发现有第二个小伙伴也遇到了同样的问题,准备把这个小问题写成一篇帖子,希望后面再遇到“ScrollView嵌套ListContainer 滑动问题”的同学可以帮助到你们。
|
Android开发 数据格式 XML
Android官方DataBinding(十二):双向绑定之反向绑定的InverseBindingMethods改造和实现
Android官方DataBinding(十二):双向绑定之反向绑定的InverseBindingMethods改造和实现 在附录文章十、十一的基础上,使用InverseBindingMethod进行双向绑定和反向绑定操作。
1266 0
|
XML 前端开发 图形学
Unity与安卓交互 之 ✨ 在Android Studio中写代码导出aar包,在Unity中使用交互(小白完整篇)
在Android Studio中写代码导出aar包,在Unity中交互调用(小白完整篇) AndroidStudio中的操作步骤: 首先,打开AndroidStudio新建一个工程,版本不同,所以操作的界面跟步骤可能不太一样,但是核心就是包名罢了,其他的一律默认Next带过就行
Unity与安卓交互 之 ✨ 在Android Studio中写代码导出aar包,在Unity中使用交互(小白完整篇)
|
XML API Android开发
Android动态换肤原理解析及实践
前言: 本文主要讲述如何在项目中,在不重启应用的情况下,实现动态换肤的效果。换肤这块做的比较好的,有网易云音乐,qq等,给用户带来了多样的界面选择和个性化定制。
2009 1
|
Android开发 存储
Android项目实战(三十七):Activity管理及BaseActivity的实现
原文:Android项目实战(三十七):Activity管理及BaseActivity的实现 Ps:7-10月 完成公司两个app项目上架。漏掉的总结 开始慢慢补上。   一、写一个Activity的管理类 1、单例模式,以栈(先进后出)的形式存储Activity对象 public cl...
1142 0