Android UI编程(8)——动态加载Fragment

通过动态加载fragment实现在一个Activity拥有3种不同的布局,直接看效果图吧:

常规模式下:

点击家居控制:

代码

AndroidManifest.xml——没有做任何修改,创建工程默认

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.wxl.fragment"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.wxl.fragment.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

fragment1.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:background="#ffcccc"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/fragment1_textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="第一个Fragment界面"
        android:textSize="50sp"/>

</LinearLayout>

fragment2.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:background="#00ffff"
    android:orientation="vertical" >

	<TextView
        android:id="@+id/fragment2_textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="第二个Fragment界面"
        android:textSize="50sp"/>    

</LinearLayout>

fragment3.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:background="#ffff00"
    android:orientation="vertical" >

	<TextView
        android:id="@+id/fragment2_textView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="第三个Fragment界面"
        android:textSize="50sp"/>    

</LinearLayout>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#000000"
    android:id="@+id/main">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="@drawable/main_menu_bk"
        android:orientation="vertical" >
        <!-- android:splitMotionEvents="false"多个view是否分流touch 事件 -->
        <LinearLayout
	        android:layout_width="wrap_content"
	        android:layout_height="match_parent"
	        android:orientation="horizontal"
	        android:layout_centerHorizontal="true"
	        android:splitMotionEvents="false">
	        <LinearLayout
	            android:id="@+id/menu_1"
	            android:layout_width="250dp"
	            android:layout_height="match_parent"
	            android:orientation="vertical" >
	            <TextView
	                android:id="@+id/textView1"
	                android:layout_width="wrap_content"
	                android:layout_height="match_parent"
	                android:layout_gravity="center"
	                android:gravity="center"
	                android:text="常规模式"
	                android:textColor="#ffffffff"
	                android:textSize="28sp" />
	        </LinearLayout>
	        <View
                android:layout_width="4dp"
	            android:layout_height="match_parent"
	            android:layout_marginBottom="10dp"
	            android:layout_marginTop="10dp"
	            android:background="?android:attr/listDivider"/>
	        <LinearLayout
	            android:id="@+id/menu_2"
	            android:layout_width="250dp"
	            android:layout_height="match_parent"
	            android:orientation="vertical" >
	            <TextView
	                android:id="@+id/textView2"
	                android:layout_width="wrap_content"
	                android:layout_height="match_parent"
	                android:layout_gravity="center"
	                android:gravity="center"
	                android:text="家居控制"
	                android:textColor="#ffffffff"
	                android:textSize="28sp" />
	        </LinearLayout>
	        <View
                android:layout_width="3dp"
	            android:layout_height="match_parent"
	            android:layout_marginBottom="10dp"
	            android:layout_marginTop="10dp"
	            android:background="?android:attr/listDivider"/>
	        <LinearLayout
	            android:id="@+id/menu_3"
	            android:layout_width="250dp"
	            android:layout_height="match_parent"
	            android:orientation="vertical" >
	            <TextView
	                android:id="@+id/textView3"
	                android:layout_width="wrap_content"
	                android:layout_height="match_parent"
	                android:layout_gravity="center"
	                android:gravity="center"
	                android:text="幸福社区"
	                android:textColor="#ffffffff"
	                android:textSize="28sp" />
	        </LinearLayout>
   		</LinearLayout>
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/root"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>

Fragment1.java

package com.wxl.fragment;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

@SuppressLint("NewApi")
public class Fragment1 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment1, container,false);
	}
}

Fragment2.java

package com.wxl.fragment;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

@SuppressLint("NewApi")
public class Fragment2 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment2, container,false);
	}
}

Fragment3.java

package com.wxl.fragment;

import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

@SuppressLint("NewApi")
public class Fragment3 extends Fragment {
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		return inflater.inflate(R.layout.fragment3, container,false);
	}
}

MainActivity.java

package com.wxl.fragment;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.LinearLayout;

public class MainActivity extends Activity implements OnClickListener{
	public static final int NORMAL_MODE = 0;
	public static final int SMARTHOME_MODE = 1;
	public static final int COMMUNITY_MODE = 2;

	FragmentManager fragmentManager;

	private int mMode = NORMAL_MODE;

	private Fragment  mFragment;//记录当前处于哪个fragment
	private Fragment1 fragment1;
	private Fragment2 fragment2;
	private Fragment3 fragment3;

	@SuppressLint("NewApi") @Override
    protected void onCreate(Bundle savedInstanceState) {
		LinearLayout menu1, menu2, menu3;
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        menu1 = (LinearLayout)this.findViewById(R.id.menu_1);
        menu1.setOnClickListener(this);
        menu2 = (LinearLayout)this.findViewById(R.id.menu_2);
        menu2.setOnClickListener(this);
        menu3 = (LinearLayout)this.findViewById(R.id.menu_3);
        menu3.setOnClickListener(this);

        fragmentManager = getFragmentManager();

        /*fragmentManager.beginTransaction()获取FragmentTransaction对象
         * hide(mFragment)隐藏当前的fragment
         * */
        fragment1 = new Fragment1();
        if (fragment1.isAdded()) {
        	fragmentManager.beginTransaction().show(fragment1).hide(mFragment).commit();
		} else {
			fragmentManager.beginTransaction().add(R.id.root, fragment1)
					.show(fragment1).commit();
		}
        mFragment = fragment1;
	}

	@SuppressLint("NewApi") @Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		int mode = NORMAL_MODE;
		switch (arg0.getId()) {
		case R.id.menu_1:
			{
				mode = NORMAL_MODE;
			}
			break;
		case R.id.menu_2:
			{
				mode = SMARTHOME_MODE;
			}
			break;
		case R.id.menu_3:
			{
				mode = COMMUNITY_MODE;
			}
			break;
		}

		if (mMode == mode)
			return;
		mMode = mode;
		FragmentTransaction fragmentTransaction;
		fragmentTransaction = fragmentManager.beginTransaction();
		if (mode == NORMAL_MODE) {
			if (fragment1 == null) {
				fragment1 = new Fragment1();
			}

			if (fragment1.isAdded()) {
				fragmentTransaction.show(fragment1).hide(mFragment).commit();
			} else {
				fragmentTransaction.add(R.id.root, fragment1)
						.show(fragment1).hide(mFragment).commit();
			}
			mFragment = fragment1;
		} else if (mode == SMARTHOME_MODE) {
			if (fragment2 == null) {
				fragment2 = new Fragment2();
			}

			if (fragment2.isAdded()) {
				fragmentTransaction.show(fragment2).hide(mFragment).commit();
			} else {
				fragmentTransaction.add(R.id.root, fragment2)
						.show(fragment2).hide(mFragment).commit();
			}
			mFragment = fragment2;
		} else if (mode == COMMUNITY_MODE) {
			if (fragment3 == null) {
				fragment3 = new Fragment3();
			}

			if (fragment3.isAdded()) {
				fragmentTransaction.show(fragment3).hide(mFragment).commit();
			} else {
				fragmentTransaction.add(R.id.root, fragment3)
						.show(fragment3).hide(mFragment).commit();
			}
			mFragment = fragment3;
		}
	}
}

注意

同一个FragmentTransaction对象只能有一次commit(),否则提示“java.lang.IllegalStateException:commit already called”。

源码下载

http://download.csdn.net/detail/thanksgining/8406745

时间: 2024-10-11 20:13:14

Android UI编程(8)——动态加载Fragment的相关文章

Android之根布局动态加载子布局时边距设置无效问题

Android大部分的控件都会有padding和layout_margin两个属性,一般来说它们的区别是: padding:控件中的内容离控件边缘的距离. margin:  控件离它的父控件边缘的距离. 今天做了一个由根布局动态加载子布局的实验,结果发现子布局中的这两个属性可以按预期的效果显示,但是给根布局设置的padding并没有对被加载的子布局产生效果. 代码如下: 根布局文件名为activity_main.xml,其xml文件定义的内容为: <LinearLayout xmlns:andr

Android 插件化之动态加载jar

有时候会看到一些应用对应的SDcard里的文件夹里有 ***.jar 等文件,现在明白这些文件大概是用来做应用内自动更新用的. 打比方说,类似eclipse 可以通过预留接口,安装各种插件一样. Android 也可以通过动态加载jar 来实现类似的业务代码更新:(这里所说的jar要通过dx工具来转化成Dalvik byte code,下文会讲到) 注意:首先需要了解一点:在Android中可以动态加载,但无法像Java中那样方便动态加载jar 原因:Dalvik虚拟机如同其他Java虚拟机一样

Android 插件开发,做成动态加载

为什么需要插件开发: 相信你对Android方法数不能超过65K的限制应该有所耳闻,随着应用程序功能不断的丰富,总有一天你会遇到一个异常: Conversion to Dalvik format failed:Unable toexecute dex: method ID not in [0, 0xffff]: 65536 可能有些同学会说,解决这个问题很简单,我们只需要在Project.proterty中配置一句话就Ok啦, dex.force.jumbo=true 是的,加入了这句话,确实可

Android APP启动页面动态加载全部权限

一.写在前面 6.0以上动态加载权限加载的是,需要用户手动赋予的权限( Dangerous Permissions),只有这些,其他权限不用加载 所属权限组 权限日历 READ_CALENDAR日历 WRITE_CALENDAR相机 CAMERA联系人 READ_CONTACTS联系人 WRITE_CONTACTS联系人 GET_ACCOUNTS位置 ACCESS_FINE_LOCATION位置 ACCESS_COARSE_LOCATION麦克风 RECORD_AUDIO电话 READ_PHON

Android动态加载那些事儿

基础 1.Java 类加载器 类加载器(class loader)是 Java?中的一个很重要的概念.类加载器负责加载 Java 类的字节代码到 Java 虚拟机中.本文首先详细介绍了 Java 类加载器的基本概念,包括代理模式.加载类的具体过程和线程上下文类加载器等,接着介绍如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi?中的应用. 2.反射原理 Java 提供的反射機制允許您於執行時期動態載入類別.檢視類別資訊.生成物件或操作生成的物件,要舉反射機制的一個應用實例,就

Android apk动态加载机制的研究(二):资源加载和activity生命周期管理

出处:http://blog.csdn.net/singwhatiwanna/article/details/23387079 (来自singwhatiwanna的csdn博客) 前言 为了更好地阅读本文,你需要先阅读Android apk动态加载机制的研究这篇文章,在此文中,博主分析了Android中apk的动态加载机制,并在文章的最后指出需要解决的两个复杂问题:资源的访问和activity生命周期的管理,而本文将会分析这两个复杂问题的解决方法.需要说明的一点是,我们不可能调起任何一个未安装的

Android插件化开发之DexClassLoader动态加载dex、jar小Demo

一.温故动态加载ClassLoader机制 如果对Android的ClassLoader加载机制不熟悉,猛戳Android插件化开发动态加载基础之ClassLoader工作机制 http://blog.csdn.net/u011068702/article/details/53248960 二.介绍 我们知道在Android中可以跟java一样实现动态加载jar,但是Android使用德海Dalvik VM,不能直接加载java打包jar的byte code,需要通过dx工具来优化Dalvik

NGUI学习笔记(四):动态加载UI和NGUI事件

动态加载UI 我们进入一个场景后,如果将这个场景所有可能用到的UI都直接放在场景中做好,由于要在进入场景时就部署好所有的UI对象,那么当UI对象较多时会碰到的问题是:1.初始化场景会产生非常明显的卡顿.2.所有UI都在场景中导致占用大量的内存. 所以我们需要对UI组件进行动态加载和销毁,当需要打开指定的UI时,动态的创建出这个UI对象,而当关闭这个UI对象之后,可以对其进行销毁从而释放出内存. 将UI制作成一个预制件 我们可以在场景中制作好一个UI,然后将其保存成一个预制件后从场景中移除,然后我

unity3d动态加载dll的API以及限制

Unity3D的坑系列:动态加载dll 一.使用限制 现在参与的项目是做MMO手游,目标平台是Android和iOS,iOS平台不能动态加载dll(什么原因找乔布斯去),可以直接忽略,而在Android平台是可以动态加载dll的,有了这个就可以实现代码更新,不过实际上,在unity里要用上动态加载dll是有很多限制的(不了解的话就是坑). 限制1:在Android手机里动态加载dll不能使用Assembly.LoadFile(string path),只能使用Assembly.Load(byte