`

Fragment构建程序的框架

 
阅读更多

通过Api可以发现原来使用用于构建普通应用程序的框架的一些类,比如TabActivity,ActivityGroup都已经不推荐使用了,转而替换成Fragment。今天我们就来看看如何使用Fragment来构建应用程序。

底部的BottomBar结合的是之前发出的一篇博客

常用的底部分段控件BottomBar(带有小图标)

下面是效果图:

 

我们再看下工程的目录:

 

这里对BottomBar就不解释了,主要讲下Fragment相关的。

首先你的界面需要继承自FragmentActivity,在它的布局文件中需要两个控件:

1. 屏幕底部的BottomBar

2. BottomBar上方的RelativeLayout(用来切换显示各个Fragment)。

接下去你就可以针对每个界面分开写布局和代码了。

 

注释代码中都有,下面直接上代码:

MainActivity.java

/**
 * This demo shows how to use FragmentActivity to build the frame of a common application.
 * To replace the deprecated class such as TabActivity, ActivityGroup,and so on.
 * 
 * 这个demo展示了如何使用FragmentActivity来构建应用程序的框架
 * 可以使用这个来替代原来的TabActivity,ActivityGroup等等
 * 
 * @author MichaelYe
 * @since 2012-9-6
 * @see http://developer.android.com/reference/android/app/Fragment.html
 * @see http://developer.android.com/training/basics/fragments/index.html
 * @see http://developer.android.com/guide/components/fragments.html
 * */
public class MainActivity extends FragmentActivity 
{

	@Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final BottomBar bottomBar = (BottomBar)findViewById(R.id.ll_bottom_bar);
        bottomBar.setOnItemChangedListener(new OnItemChangedListener() 
        {
			
			@Override
			public void onItemChanged(int index) 
			{

				showDetails(index);
			}
		});
        bottomBar.setSelectedState(0);
        
//        bottomBar.hideIndicate();//这个代码原来控制红色小图标的可见性
//        bottomBar.showIndicate(12);
        
    }
	
	private void showDetails(int index)
	{
		Fragment details = (Fragment)
	            getSupportFragmentManager().findFragmentById(R.id.details);
		switch(index)
		{
		case 0:
			details = new FragmentExecute();
			break;
		case 1:
			details = new FragmentLaunch();
			break;
		case 2:
			details = new FragmentTeam();
			break;
		case 3:
			details = new FragmentSearch();
			break;
		case 4:
			details = new FragmentSetting();
			break;
		}
		// Execute a transaction, replacing any existing
        // fragment with this one inside the frame.
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.details, details);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
//        ft.addToBackStack(null);//这行代码可以返回之前的操作(横屏的情况下,即两边都显示的情况下)
        ft.commit();
	}
}

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/bg_login"
    android:orientation="vertical" >

    <RelativeLayout
        android:id="@+id/details"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/ll_bottom_bar" />

    <com.michael.widget.BottomBar
        android:id="@+id/ll_bottom_bar"
        android:layout_width="fill_parent"
        android:layout_height="60dip"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

 

/**
 * 需要使用不带参数的构造器,可以使用getActivity()替换context参数
 * 否则屏幕在旋转的时候会抛出异常:
 * Caused by: java.lang.InstantiationException: 
 * can't instantiate class com.michael.fragment.FragmentExecute; no empty constructor
 * 
 * @see http://stackoverflow.com/questions/7016632/unable-to-instantiate-fragment
 * */
public class FragmentExecute extends Fragment
{

	public FragmentExecute()
	{
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) 
	{
		if (container == null) 
		{
            // Currently in a layout without a container, so no
            // reason to create our view.
            return null;
        }
		LayoutInflater myInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
	    View layout = myInflater.inflate(R.layout.frag_execute, container, false); 
		
		return layout;
	}
}

 

 frag_execute.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    
    <RelativeLayout
        android:id="@+id/rl_title"
        android:layout_width="fill_parent"
        android:layout_height="45dip"
        android:layout_alignParentTop="true"
        android:layout_centerVertical="true"
        android:background="@drawable/bg_title_bar"
        android:gravity="center" >

        <Button
            android:id="@+id/btn_back"
            android:layout_width="70dip"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"   
            android:layout_marginBottom="5dip"
            android:layout_marginLeft="8dip"
            android:layout_marginTop="5dip"
            android:background="@drawable/title_btn_back_selector"
            android:text="@string/workbench_home_page"
            android:textColor="@color/title_button_color_gray" />

        <Button
            android:id="@+id/btn_add"
            android:layout_width="70dip"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="5dip"
            android:layout_marginRight="8dip"
            android:layout_marginTop="5dip"
            android:background="@drawable/title_btn_rect_selector"
            android:text="@string/workbench_add_task"
            android:textColor="@color/title_button_color_gray" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:text="@string/workbench_title"
            android:textColor="@color/title_color_white"
            android:textSize="22sp" />
    </RelativeLayout>

    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="30sp"
        android:text="@string/num_0" 
        />

</RelativeLayout>

其它的Fragment也可以这样写。

 

使用Fragment有两个好处:

让手机和平板之间更好的显示,这个你可以参考API;

再就是有回退功能,addToBackStack(null); 加入这个方法,当你按返回键的时候,就可以实现界面的回退了(回到之前的Fragment)。

 

项目下载地址:

https://github.com/michaelye/DemoFragment

 

  • 大小: 62.2 KB
  • 大小: 67.4 KB
分享到:
评论
3 楼 yuekongkong 2013-04-08  
同问。。。。。。。。。
2 楼 oyquanmin 2013-01-30  
andy_apple 写道
每次点击,改变显示的时候,使用以下代码:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.details, details); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);   
ft.commit(); 

这样,每次切换Fragment都会重新Create吧?
这样的话,如何保存当前Fragment的状态?
比如,第一个Fragment中有个listView滑动到一半,然后切换到另一个Fragment上了,再切换回来时,如何保证原Fragment不被重新创建?

同问!!!
1 楼 andy_apple 2012-09-24  
每次点击,改变显示的时候,使用以下代码:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
ft.replace(R.id.details, details); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);   
ft.commit(); 

这样,每次切换Fragment都会重新Create吧?
这样的话,如何保存当前Fragment的状态?
比如,第一个Fragment中有个listView滑动到一半,然后切换到另一个Fragment上了,再切换回来时,如何保证原Fragment不被重新创建?

相关推荐

    Fragment框架demo

    Fragment,通过Api可以发现原来使用用于构建普通应用程序的框架的一些类,比如TabActivity,ActivityGroup都已经不推荐使用了,转而替换成Fragment。继承FragmentActivity

    Android项目源码一款基于MVP设计模式开发的仿淘宝APP.zip

    2016/10/18 构建基本MVP框架 开发过程中遇到的问题(可能导致程序无法运行的bug)及解决方案 当用户未登录时,点击购物车,登陆之后,程序闪退 出现问题 :NullPointerException 解决方案: 使用Fragment的延时加载(懒...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版) 1/2

    《JavaServer Faces 2.0完全参考手册》主要内容:搭建开发环境并构建JSF应用程序。理解JSF请求处理生命周期。使用Facelets视图声明语言、托管bean和JSF表达式语言(EL)。按照JSF导航模型声明一个页面,包括新的...

    JavaServer Faces 2.0完全参考手册(JSF2.0中文版).part1

    《JavaServer Faces 2.0完全参考手册》主要内容:搭建开发环境并构建JSF应用程序。理解JSF请求处理生命周期。使用Facelets视图声明语言、托管bean和JSF表达式语言(EL)。按照JSF导航模型声明一个页面,包括新的...

    安卓java获取webview源码-turbo-android:用于制作Turbo原生应用的Android框架

    视图构建高保真混合应用程序。 适用于 Android 的 Turbo Native 提供了将启用的 Web 应用程序包装在本机 Android shell 中的工具。 它跨多个 Fragment 目标管理单个 WebView 实例,为您提供具有 Turbo 的所有客户端...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    SSH 为 Struts+Spring+Hibernate的一个集成框架,是目前较流行的一种Web应用程序开源框架。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久...

    精通ANDROID 3(中文版)1/2

    13.4 处理程序示例驱动程序类  13.4.1 驱动程序活动文件  13.4.2 布局文件  13.4.3 菜单文件  13.4.4 描述文件  13.5 组件和进程寿命  13.5.1 活动生命周期  13.5.2 服务生命周期  13.5.3 接收程序...

    精通Android 3 (中文版)2/2

    13.4 处理程序示例驱动程序类  13.4.1 驱动程序活动文件  13.4.2 布局文件  13.4.3 菜单文件  13.4.4 描述文件  13.5 组件和进程寿命  13.5.1 活动生命周期  13.5.2 服务生命周期  13.5.3 接收程序...

    afilechooser:带有想法的文件选择器

    由于许多 Android 设备没有库存的文件资源管理器,因此开发人员必须经常指导用户自己安装或构建一个。 aFileChooser 解决了这个问题。 特征: 完整的文件浏览器 简化GET_CONTENT意图创建 挂钩存储访问框架 确定 ...

    word源码java-MobileBankApp:AndroidOS上的模拟手机银行APP

    客户端展示了基于androidOS的编程方法和框架,例如Acticity类、Fragment类的使用以及UI/Main线程和worker线程的分离。 客户端-服务器消息传输层基于TCP/IP协议实现消息封装、拆分和一些相关的传输机制。 演示 存储库...

Global site tag (gtag.js) - Google Analytics