android (二) -fragment 的动态加载

来源:互联网 发布:云计算操作系统虚拟化 编辑:程序博客网 时间:2024/05/20 18:55


前提,6个布局文件和5个Fragment的实现,这里我们用到了十张图片


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:background="#ccc"    android:orientation="vertical"    tools:context="com.example.m_93fragmentact.MainActivity" >    <FrameLayout        android:id="@+id/fl"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1" >    </FrameLayout>    <View        android:layout_width="match_parent"        android:layout_height="0.6dp"        android:background="#E0FFFF" />    <LinearLayout        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:background="#fff"        android:orientation="horizontal" >        <ImageView            android:id="@+id/tuijian"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:background="@drawable/tuijian1" />        <ImageView            android:id="@+id/faxian"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:background="@drawable/faxian1" />        <ImageView            android:id="@+id/daohang"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:background="@drawable/daohang1" />        <ImageView            android:id="@+id/wode"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:background="@drawable/wode1" />        <ImageView            android:id="@+id/lixian"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_weight="1"            android:background="@drawable/lixian1" />    </LinearLayout></LinearLayout>
wodefragment.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="#ddD700"    android:orientation="vertical" >    <TextView        android:id="@+id/e"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="50dp"        android:text="我的"        android:textSize="40dp" /></LinearLayout>
lixianfragment.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="#FFD700"    android:orientation="vertical" >    <TextView        android:id="@+id/e"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="50dp"        android:text="离线"        android:textSize="40dp" /></LinearLayout>

等等。。。。。。

五个实现类Fragment

tuijianfragment.java

package com.example.m_93fragmentact;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class tuijianfragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stub\View view = inflater.inflate(R.layout.tuijianfragment, container, false);return view;}}
faxianfragment.java
package com.example.m_93fragmentact;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class faxiangragment extends Fragment{@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubView view= inflater.inflate(R.layout.faxianfragment, container, false);return view;}}






Mainactivity的实现

1.声明变量加载五个布局文件 和五个fragment和设置

上一个博客,或者看前提


2.知道什么是动态加载 Fragment


 

Fragment:Activity片段

   a)Fragment的特点:

    (1)Fragment作为Activity界面的一部分组成出现

    (2)可以在一个Activity中同时出现多个Fragment,一个Fragment亦可在多个Activity中使用。

    (3)在Activity运行过程中,可以添加、移除或者替换Fragment(add()、remove()、replace())

    (4)Fragment可以响应自己的输入事件,并且有自己的生命周期,当然,它们的生命周期直接被其所属的宿主activity的生命周期影响。只有当Activity处于活动状态时,程序员可通过方法独立的操作Fragment.

例如:Android3.0引入Fragment的初衷是为了适应

大屏幕的平台电脑,Framgment简化了大屏幕UI的设计,对UI组件进行分组,模块化管理,可以更方便地运行过程中动态更新Activity的用户界面,新闻浏览界面,该界面需要屏幕左边显示新闻列表,并在屏幕右边显示新闻内容。此时就可以再Activity中显示两个并排的Fragment,左边的Fragment显示新闻列表,右边的Fragment显示新闻内容。如果需要在正常尺寸的手机屏幕上运行该应用,可以改为使用两个Activity,ActivityA包含FragmentA,ActivityB包含FragmentB.

 

   b)使用:

    1、建立Fragment:创建类继承Fragment或其子类

    2、实现相关的回调函数

         通常, 可以实现如下的生命周期方法:onCreate():当创建fragment时, 系统调用该方法.

在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止

后可以恢复.

        onCreateView():fragment第一次绘制它的用户界面的时候,系统会调用此方法. 为了绘制fragmentUI,此方法必须返回一个View,这个view是你的fragment布局的根view.如果fragment不提供UI,可以返回null.

   

 

       onPause():用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁), 在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回)

       onAttach():fragment和activity建立关系,只是一种约定

   3、将Fragment加入宿主Activity

      可以使用一下两种方式实现:

      (1)在布局文件中配置:

           <fragment

                android:name="Fragment的className"

              android:id="@+id/frag"

             android:layout_width="wrap_content"

             android:layout_height="match_parent"/>

      (2)通过Activity的FragmentManager实现

            步骤:

                  1)获取FragmentManager对象

                  2)开启一个事务:beginTransaction()

                  3)调用add()添加Fragment对象

                                           remove()删除Fragment对象

                       replace()替换Fragment对象

                  4)可以调用addToBackStack(),

                  将事务添加到一个fragment事务的backstack.

                  这个back stack由activity管理, 并允许用户通过按下

                  BACK按键返回到前一个fragment状态.

                  5)提交事务commit();

4.Fragment与Activity通信

    Fragment可以通过getActivity()获取其宿主Activty的实例

    Activity可以通过FragmentManager的findFragmentById()获取Fragment实例。

    只要将Fragment装载进去就是Activity的一部分,获取控件和之前的方式一致。

 

5.Fragment的生命周期

与Activity的生命周期很类似,分为:活动状态,暂停状态,停止状态,销毁状态

onAttach():当Activity与Fragment发生关联时调用

onCreate():创建Fragment时被回调

onCreateView():创建或者绘制该Fragment的View组件时回调该方法,

               Fragment将会显示该方法返回的View组件.

onActivityCreated():当Fragment所在的Activity的onCreate方法返回值回调该方法。

onStart():启动Fragment时被回调

onResume():恢复Fragment时被调用,onStart方法后一定会回调该方法

onPause():暂停Fragment时被调用

onStop():停止Fragment时被调用

onDestoryView():当该Fragment被移除时回调,

               与oncreateView相对应。

onDestory():销毁Fragment时被回调

onDetach():与onAttach相对应,当该Fragment与Activity关联被取消时回调,被替换完成时回调该方法,

   onDestory方法后一定回调该方法。

 

6.为Activity创建事件回调函数

      在一些情况下, 可能需要一个fragment与activity分享事件.

      一个好的方法是在fragment中定义一个回调的interface,并要求宿主activity实现它.

      并且在Fragment的onAttach()方法中获取该Activity的实例。

      activity通过interface接收到该回调,必要时它可以和在

      layout中的其他fragment分享信息


管理者fragmentmanger,功能fragmenttrannsaction,管理者提供权限给功能,他还有replace,add,hide,show..等等类型。


FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();tuijian.setImageResource(R.drawable.tuijian2);fragmentTransaction.add(R.id.fl, new tuijianfragment());fragmentTransaction.commit();


3.声明全局变量加载五个图片,根据图片来选择跳转的fragment占位区,点击图片颜色会变

根据点击事件来跳转Fragment的占位区和更换掉点击图片
ImageView wode;ImageView tuijian;ImageView lixian;ImageView daohang;ImageView faxian;/* * 1.声明变量加载五个布局文件 2.动态加载 Fragment * 管理者fragmentmanger,功能fragmenttrannsaction,管理者提供权限给功能 * 3.根据图片来选择跳转的fragment占位区,点击图片颜色会变 * 4.设置一个内部类来继承接口OnClickListener来实现方法onClick,在方法里写点击事件 * 5.设置一个方法设置进入程序的初始位置在推荐里面 */// 管理者fragmentmanger,功能fragmenttrannsactionwode = (ImageView) findViewById(R.id.wode);tuijian = (ImageView) findViewById(R.id.tuijian);lixian = (ImageView) findViewById(R.id.lixian);daohang = (ImageView) findViewById(R.id.daohang);faxian = (ImageView) findViewById(R.id.faxian);tuijian.setOnClickListener(new MyOnClick());wode.setOnClickListener(new MyOnClick());lixian.setOnClickListener(new MyOnClick());faxian.setOnClickListener(new MyOnClick());daohang.setOnClickListener(new MyOnClick());


4.设置一个内部类来继承接口OnClickListener来实现点击方法onClick,在方法里写点击事件

实现一个点击内部类,继承端口
class MyOnClick implements OnClickListener {
@Override
public void onClick(View v) {}
}

5. 在内部类里面设置俩个方法

clear();清空掉上一次点击图片更换的图片
selectfragment(int i); 设置更改图片和设置Fragment
fragmentTransaction.commit(); 提交事件
private void clear() {// TODO Auto-generated method stubtuijian.setImageResource(R.drawable.tuijian1);wode.setImageResource(R.drawable.wode1);faxian.setImageResource(R.drawable.faxian1);daohang.setImageResource(R.drawable.daohang1);lixian.setImageResource(R.drawable.lixian1);}void selectfragment(int i) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();switch (i) {case 0:tuijian.setImageResource(R.drawable.tuijian2);fragmentTransaction.replace(R.id.fl, new tuijianfragment());break;case 1:faxian.setImageResource(R.drawable.faxian2);fragmentTransaction.replace(R.id.fl, new faxiangragment());break;case 2:daohang.setImageResource(R.drawable.daohang2);fragmentTransaction.replace(R.id.fl, new daohangfragment());break;case 3:wode.setImageResource(R.drawable.wode2);fragmentTransaction.replace(R.id.fl, new wodefragment());break;case 4:lixian.setImageResource(R.drawable.lixian2);fragmentTransaction.replace(R.id.fl, new lixianfragment());break;}fragmentTransaction.commit();}


6.实现内部类的方法

@Overridepublic void onClick(View v) {// TODO Auto-generated method stubclear();if (v == tuijian) {selectfragment(0);}if (v == wode) {selectfragment(3);}if (v == lixian) {selectfragment(4);}if (v == daohang) {selectfragment(2);}if (v == faxian) {selectfragment(1);}}



7.在内部类外面设置一个方法设置进入程序的初始位置在推荐里面

private void moren() {// TODO Auto-generated method stubFragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();tuijian.setImageResource(R.drawable.tuijian2);fragmentTransaction.add(R.id.fl, new tuijianfragment());fragmentTransaction.commit();}


全部代码

package com.example.m_93fragmentact;import android.app.Activity;import android.os.Bundle;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;public class MainActivity extends FragmentActivity {ImageView wode;ImageView tuijian;ImageView lixian;ImageView daohang;ImageView faxian;/* * 1.声明变量加载五个布局文件 2.动态加载 Fragment * 管理者fragmentmanger,功能fragmenttrannsaction,管理者提供权限给功能 * 3.根据图片来选择跳转的fragment占位区,点击图片颜色会变 * 4.设置一个内部类来继承接口OnClickListener来实现方法onClick,在方法里写点击事件 * 5.设置一个方法设置进入程序的初始位置在推荐里面 */@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 管理者fragmentmanger,功能fragmenttrannsactionwode = (ImageView) findViewById(R.id.wode);tuijian = (ImageView) findViewById(R.id.tuijian);lixian = (ImageView) findViewById(R.id.lixian);daohang = (ImageView) findViewById(R.id.daohang);faxian = (ImageView) findViewById(R.id.faxian);tuijian.setOnClickListener(new MyOnClick());wode.setOnClickListener(new MyOnClick());lixian.setOnClickListener(new MyOnClick());faxian.setOnClickListener(new MyOnClick());daohang.setOnClickListener(new MyOnClick());moren();}private void moren() {// TODO Auto-generated method stubFragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();tuijian.setImageResource(R.drawable.tuijian2);fragmentTransaction.add(R.id.fl, new tuijianfragment());fragmentTransaction.commit();}class MyOnClick implements OnClickListener {private void clear() {// TODO Auto-generated method stubtuijian.setImageResource(R.drawable.tuijian1);wode.setImageResource(R.drawable.wode1);faxian.setImageResource(R.drawable.faxian1);daohang.setImageResource(R.drawable.daohang1);lixian.setImageResource(R.drawable.lixian1);}void selectfragment(int i) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();switch (i) {case 0:tuijian.setImageResource(R.drawable.tuijian2);fragmentTransaction.replace(R.id.fl, new tuijianfragment());break;case 1:faxian.setImageResource(R.drawable.faxian2);fragmentTransaction.replace(R.id.fl, new faxiangragment());break;case 2:daohang.setImageResource(R.drawable.daohang2);fragmentTransaction.replace(R.id.fl, new daohangfragment());break;case 3:wode.setImageResource(R.drawable.wode2);fragmentTransaction.replace(R.id.fl, new wodefragment());break;case 4:lixian.setImageResource(R.drawable.lixian2);fragmentTransaction.replace(R.id.fl, new lixianfragment());break;}fragmentTransaction.commit();}@Overridepublic void onClick(View v) {// TODO Auto-generated method stubclear();if (v == tuijian) {selectfragment(0);}if (v == wode) {selectfragment(3);}if (v == lixian) {selectfragment(4);}if (v == daohang) {selectfragment(2);}if (v == faxian) {selectfragment(1);}}}}




5 0
原创粉丝点击