展会信息港展会大全

Fragment的使用与学习及使用过程中遇到的问题
来源:互联网   发布日期:2015-09-29 11:00:43   浏览:1788次  

导读:一直以来大概做带有导航类的应用的时候,都是使用TabActivity,但是,最新的SDK把TabActivity标成了deprecated,那只能重新寻找替代方案了,目前网上说的方案都是很混乱...

一直以来大概做带有导航类的应用的时候,都是使用TabActivity,但是,最新的SDK把TabActivity标成了deprecated,那只能重新寻找替代方案了,目前网上说的方案都是很混乱的

Fragment翻译过来叫碎片,但是我个人觉得可以理解为具有生命周期的View

由于Fragment是3.0以后的东西,对于适应低版本,那我们只能使用谷歌官方提供的android-support-v4.jar这个包了,最快捷的办法就是右击工程名,选择Android Tools——add support library...,即可添加这个包了

由于3.0以下的Activity里面没有对Fragment的支持,所以选择继承android-support-v4.jar包中的FragmentActivity,其功能跟3.0及以后的版本的Activity的功能一样

DEMO下载:

FragmentTest.zip

底部导航加顶部导航,使用FragmentTabHost,Fragmetn,FragmentActivity组成,代码已经打包上传了

1、首先,底部导航的实现,FragmentTabHost和以前的TabHost的区别就是增加了对Fragment的支持,这里的实现和其他使用TabActivity是一样的,只是选项卡的切换已经从activity变成fragment了

2、这里主要讲一下顶部导航的实现,为了让大家对fragment更好的理解,这里我没有采用FragmentTabHost,而是放了三个Button

?

package com.yyb.fragmenttest;

import android.os.Bundle;

import android.support.v4.app.FragmentTabHost;

import android.support.v4.app.FragmentTransaction;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.view.View.OnClickListener;

public class Fragment1

extends BaseFragment

implements OnClickListener{

public static BaseFragment

newInstance(int index)

{

BaseFragment

fragment = new Fragment1();

Bundle

args = new Bundle();

args.putInt("index",

index);

fragment.setArguments(args);

fragment.setIndex(index);

return fragment;

}

private View

layoutView;

private FragmentTabHost

mTabHost;

@Override

public void onCreate(Bundle

savedInstanceState) {

super.onCreate(savedInstanceState);

}

@Override

public View

onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {

layoutView

= inflater.inflate(R.layout.fragment_tabs, null);

layoutView.findViewById(R.id.button1).setOnClickListener(this);

layoutView.findViewById(R.id.button1).setSelected(true);

layoutView.findViewById(R.id.button2).setOnClickListener(this);

layoutView.findViewById(R.id.button3).setOnClickListener(this);

if(savedInstanceState

==null){

BaseFragment

fragment = (BaseFragment)getChildFragmentManager().findFragmentByTag(0+"");//

getActivity().getSupportFragmentManager().findFragmentByTag(index+"");

if(fragment==null){

init(0);

}

}

return layoutView;

}

private void init(int index)

{

FragmentTransaction

ft = getChildFragmentManager().beginTransaction();

ft.add(R.id.realtabcontent,

Fragment11.newInstance(index) ,index+"");//将得到的fragment

替换当前的viewGroup内容,add则不替换会依次累加

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果

ft.commit();//提交

}

@Override

public void onClick(View

v) {

allNoSelect();

switch (v.getId())

{

case R.id.button1:

placeView(0);

break;

case R.id.button2:

placeView(1);

break;

case R.id.button3:

placeView(2);

break;

default:

break;

}

v.setSelected(true);

}

private void allNoSelect()

{

layoutView.findViewById(R.id.button1).setSelected(false);

layoutView.findViewById(R.id.button2).setSelected(false);

layoutView.findViewById(R.id.button3).setSelected(false);

}

public void placeView(int index){

BaseFragment

fragment = (BaseFragment)<span style="color:

#ff0000;">getChildFragmentManager()</span>.findFragmentByTag(index+"");//

getActivity().getSupportFragmentManager().findFragmentByTag(index+"");

//得到一个fragment

事务(类似sqlite的操作)

FragmentTransaction

ft = getChildFragmentManager().beginTransaction();

if (fragment

== null )

{

switch (index)

{

case 0:

fragment

= Fragment11.newInstance(index);

return;

case 1:

fragment

= Fragment11.newInstance(index);

break;

case 2:

fragment

= Fragment11.newInstance(index);

break;

default:

return;

}

}

ft.replace(R.id.realtabcontent,

fragment,index+"");//将得到的fragment

替换当前的viewGroup内容,add则不替换会依次累加

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);//设置动画效果

ft.addToBackStack(null);

ft.commit();//提交

}

}

这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment

FragmentManager(碎片管理器),用来管理当前Activity中所有的Fragment

每次替换或者添加后,都要commit一样,才能算一个完整的事务,这里用了Fragment嵌套,还要注意一个问题,由于我当时没注意,导致想了好久才找出问题的原因所在,如果你是嵌套了Fragment,那么使用FragmentManager的一定要注意你当前的Fragment是属于嵌套的fragment还是顶层的Fragment,如果是顶层Fragment,那么你调用FragmentManager的时候,应该这样写getActivity().getSupportFragmentManager(),如果是嵌套的fragment那么应该这样写getChildFragmentManager()

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港