求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
 
追随技术信仰

随时听讲座
每天看新闻
 
 

Android开发教程
Android 开发环境配置
Android 架构
Android 应用组件
Android Hello World示例
Android 资源组织和访问
Android Activity
Android Service
Android 广播接收器
Android 内容提供者
Android 碎片/片段
Android Intent过滤器
Android UI布局
Android UI控件
Android 事件处理
Android 样式和主题
Android 自定义组件
Android 拖放
Android 通知
Android 基于位置服务
Android 发送电子邮件
Android 发送短信/SMS
Android 拨打电话
发布Android应用
ndroid Alertdialog
Android Animation实例
Android音频捕获
Android音频管理器实例
Android
Android最佳实践
Android Bluetooth实例
Android Camera
Android Clipboard
Android自定义字体
Android数据备份
Android Gestures/手势
Android图片效果
Android图片切换
Android内部存储
Android JetPlayer实例
Android JSON解析器
Android加载Spinner
Android本地化
Android登录实例
Android MediaPlayer
 
 

Android内容提供者
34 次浏览
6次  
 捐助

片段(Fragments)是一个应用程序的用户界面或行为活动,使活动更加模块化设计,可以放置在一块。一个片段是一种子活动。以下要点有关片段:

  • 片段都有自己的布局和规范自己的行为与生命周期回调。
  • 可以添加或删除片段在活动而活动运行。
  • 可以将多个片段在一个单一的活动,建立一个多窗格UI。
  • 片段可用于多种活动。
  • 片段的生命周期是密切相关,其主机活动的生命周期,表示当活动暂停时,所有的片段也将停止活动。
  • 片段可以实现的行为当没有用户界面组件。
  • 片段加入被加入到 Android API 在Honeycomb版本的Android(API版本11)。

创建片段可以扩展Fragment?类并在活动的布局文件中声明片段,可以插入到活动布局的一个片段到<fragment>元素。

介绍片段之前,有一个限制,因为可以在一个特定的时间点,屏幕上只显示单个活动。所以不能够分割设备屏幕来分别控制不同部位。但随着引进片段得到了更多的灵活性,并在屏幕上同一时时间可以将一个单一的活动取消限制。现在有一个单一的acitivity?,但每个acitivity?可以包括多个片段,它们有自己的布局,活动和完整的生命周期。

下面是一个典型的例子,两个UI模块定义的片段可以组合成平板电脑的设计的一个活动,这里在手机中设计分离。

应用程序嵌入活动A中两个片段,在一个平板大小的设备上运行。然而在手机大小的屏幕上,有两个片段有足够的空间,所以Activity A包括片段物品的清单,当用户选择一篇文章时,它开始使用Activity B,包括阅读第二片段的文章。

片段生命周期

Android 的碎片有自己的生命周期,非常相似 Android 中的 Activity 。本节主要阐述其生命周期在不同阶段。

如何使用碎片?

这里演示简单的步骤来创建碎片:

  • 首先,要决定有多少碎片要在活动中要使用。例如,要使用两个片段处理设备的横向和纵向模式。
  • 在下一页的碎片数量的基础上,创建类将扩展?Fragment?类。上述片段类的回调函数。可以根据要求覆盖所有的功能。
  • 对应每一个片段,需要在XML文件中创建布局。这些文件将根据布局来定义碎片。
  • 最后修改活动文件替换片段,根据需要来定义实际的逻辑。

这里是重要的 覆盖在Fragment?类的方法,如下列表:

  • onCreate()?系统调用时创建片段。初始化片段要保留暂停或停止时的片段,然后恢复其它组成部分。
  • onCreateView()?当片段第一次绘制用户界面时,系统调用这个回调。要绘制一个UI为片段,必须返回一个 View 组件,此方法是片段的根布局。返回空片段不提供一个UI。
  • onPause()?系统调用此方法,作为第一次指示用户离开此片段。这通常是提交更改操作,持久化时间超过当前用户会话时间。

例子

下面的这个例子将解释如何创建片段 - Fragments。在这里将创建两个片段并且当其中一个使用的设备是在横向模式下,另一个片段将被用在纵向模式下。按照下面的步骤类似于在前面创建的Hello World范例:

以下是主要活动文件的内容 src/com.example.mycontentprovider/MainActivity.java 修改

package com.example.myfragments;
    import android.os.Bundle;
    import android.app.Activity;
    import android.app.FragmentManager;
    import android.app.FragmentTransaction;
    import android.content.res.Configuration;
    import android.view.WindowManager;
    public class MainActivity extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          Configuration config = getResources().getConfiguration();
          FragmentManager fragmentManager = getFragmentManager();
          FragmentTransaction fragmentTransaction =
          fragmentManager.beginTransaction();
          /**
         * Check the device orientation and act accordingly
         */
         if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {
           /**
           * Landscape mode of the device
           */
           LM_Fragment ls_fragment = new LM_Fragment();
           fragmentTransaction.replace(android.R.id.content, ls_fragment);
        }else{
           /**
           * Portrait mode of the device
           */
           PM_Fragment pm_fragment = new PM_Fragment();
           fragmentTransaction.replace(android.R.id.content, pm_fragment);
        }
        fragmentTransaction.commit();
     }
 }

创建两个的片段文件LM_Fragement.java 和 PM_Fragment.java在com.example.mycontentprovider 包下。
以下是LM_Fragement.java文件的内容 :

package com.example.myfragments;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    public class LM_Fragment extends Fragment{
       @Override
       public View onCreateView(LayoutInflater inflater,
          ViewGroup container, Bundle savedInstanceState) {
        /**
         * Inflate the layout for this fragment
         */
        return inflater.inflate(
        R.layout.lm_fragment, container, false);
     }
  }

下面是 PM_Fragement.java 文件的内容:

package com.example.myfragments;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    public class PM_Fragment extends Fragment{
       @Override
       public View onCreateView(LayoutInflater inflater,
          ViewGroup container, Bundle savedInstanceState) {
        /**
         * Inflate the layout for this fragment
         */
        return inflater.inflate(
        R.layout.pm_fragment, container, false);
     }
  }

创建两个布局文件 lm_fragement.xml 和 pm_fragment.xml 在目录 res/layout 下。 以下是 lm_fragement.xml 文件的内容:

<?xml version="1.0" encoding="utf-8"?>
     <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:background="#7bae16">
     <TextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/landscape_message"
     android:textColor="#000000"
     android:textSize="20px" />
    <!-- More GUI components go here  -->
    </LinearLayout>

以下是 pm_fragment.xml 文件的内容:

<?xml version="1.0" encoding="utf-8"?>
     <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="horizontal"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:background="#666666">
     <TextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="@string/portrait_message"
     android:textColor="#000000"
     android:textSize="20px" />
    <!-- More GUI components go here  -->
    </LinearLayout>

下面 res/layout/activity_main.xml 文件的内容,其中包括片段:

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:orientation="horizontal">
    <fragment
     android:name="com.example.fragments"
     android:id="@+id/lm_fragment"
     android:layout_weight="1"
     android:layout_width="0dp"
     android:layout_height="match_parent" />
    <fragment
     android:name="com.example.fragments"
     android:id="@+id/pm_fragment"
     android:layout_weight="2"
     android:layout_width="0dp"
     android:layout_height="match_parent" />
    </LinearLayout>

确保 res/values/strings.xml 文件有以下内容:

<?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="app_name">MyFragments</string>
        <string name="action_settings">Settings</string>
        <string name="hello_world">Hello world!</string>
        <string name="landscape_message">This is Landscape mode fragment
        </string>
        <string name="portrait_message">This is Portrait mode fragment
        </string>
    </resources>

现在试着来运行 MyFragments 刚刚创建的应用程序。假设创建AVD,同时做好了环境设置。要从Eclipse运行应用程序,首先打开一个项目的活动文件,从工具栏上单击“Run”? 图标。 Eclipse AVD 安装应用程序,并启动它,如果设置和应用都没有问题,它会显示仿真器窗口,看到如下窗口,点击"MENU" 按钮。可能需要点耐心,因为它可能需要一段时间(提示:取决于你的电脑速度了):

要改变模式,模拟器的屏幕,可以做以下操作:

  • fn+control+F11?Mac上改变的风景,图像,反之亦然。
  • ctrl+F11?在Windows.
  • ctrl+F11?在?Linux.

改变了模式以后,能够看到的图形用户界面,如下已经实现了横向模式:

 

这样就可以使用相同的活动,但不同的GUI要通过不同的片段。根据要求可以使用不同类型的GUI组件来创建不同的GUI。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



34 次浏览
6次
 捐助
 

每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号