使用Fragment创建灵活的用户界面
什么是Fragment
Fragment的作用像Activity一样,主要用于呈现用户界面,它依附于Activity存在,但比Activity更灵活。
当我们需要创建动态的,多面板的界面的时候就需要使用Fragment。
继承Fragment类
继承Fragment类,并覆盖相应的方法,就可以实现自己的Fragment类。 但是Fragment类是在Android 3.0添加的。
要在低于这个版本下使用Fragment,就需要导入v7 appcompat库。另外,Fragment的容器必须是FragmentActivity,
ActionBarActivity也可以,因为它继承于FragmentActivity。
在使用ActionBarActivity的时候,要想程序正常运行,程序的主题必须基于Theme.AppCompact,否则,程序崩溃。
如下:
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light" >
<activity
android:name="com.whathecode.usingfragment.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>
程序布局:

示例代码
TitleFragment:
package com.whathecode.usingfragment; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class TitleFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.thetitle, container, false);
}
}
ContentFragment:
package com.whathecode.usingfragment; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class ContentFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.thecontent, container, false);
}
}
上面两个Fragment类的代码基本一样,只是使用了不同的布局界面。
和Activity不一样的,Fragment是在onCreateView方法中嵌入界面,而Activity是在onCreate方法中使用setContentView方法设置界面布局。
activity_main界面代码
<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="horizontal"
tools:context=".MainActivity" > <LinearLayout
android:id="@+id/titleC"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="fill_parent"
android:orientation="vertical"/> <LinearLayout
android:id="@+id/contentC"
android:layout_width="0dp"
android:layout_weight="2"
android:layout_height="fill_parent"
android:orientation="vertical"/> </LinearLayout>
材料都准备好后,最后一步就是将Fragment添加到Activity上面
package com.whathecode.usingfragment; import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity; public class MainActivity extends ActionBarActivity
{ @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); /**
* 使用FragmentTransaction中的add方法将Fragment嵌入到当前的Activity上
*/
FragmentManager supportFragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = supportFragmentManager.beginTransaction(); //嵌入TitleFragment
transaction.add(R.id.titleC, new TitleFragment()); /**
* 当所有的事务完成之后才能调用commit方法。
* commit方法不能多次调用,否则程序崩溃
*/ //嵌入ContentFragment
transaction.add(R.id.contentC, new ContentFragment()).commit();
}
}
运行效果:
Fragment间通讯
既然,Fragment是依附在Activity上面,那么它必然也是通过Activity作为媒介进行通讯。
假如我想在TitleFragment中获取ContentFragment中的内容,可以这样做:
1. 通过getActivity获得当前Activity的实例
2. 通过Activity的findViewById方法取得想要获取的View
示例代码:
package com.whathecode.usingfragment; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class TitleFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.thetitle, container, false);
} @Override
public void onStart()
{
super.onStart(); //获取界面中的Button按钮
Button btn = (Button) getActivity().findViewById(R.id.getContent); //绑定onClick事件
btn.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{ //获取ContentFragment布局中的textView
TextView txtView = (TextView) getActivity().findViewById(
R.id.content); //获取TextView中的文本内容
String content = txtView.getText().toString(); //显示内容
Toast.makeText(getActivity(), content, Toast.LENGTH_SHORT)
.show();
}
});
}
}
运行结果:

当然,这只是其中一种方法,也是不怎么好的方法。官方建议是在Fragment中定义一个接口,然后由Activity容器实现这个接口。
改良后的代码:
在TitleFragment中添加接口
package com.whathecode.usingfragment; import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class TitleFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
return inflater.inflate(R.layout.thetitle, container, false);
} /**
*
* @author Administrator
*新添加的接口,由Activity实现
*/
public interface onGetContentListener
{
public void onGetContent();
}
}
实现接口:
package com.whathecode.usingfragment; import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends ActionBarActivity implements
TitleFragment.onGetContentListener
{
FragmentManager supportFragmentManager = getSupportFragmentManager();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); /**
* 使用FragmentTransaction中的add方法将Fragment嵌入到当前的Activity上
*/ FragmentTransaction transaction = supportFragmentManager
.beginTransaction(); // 嵌入TitleFragment
transaction.add(R.id.titleC, new TitleFragment()); /**
* 当所有的事务完成之后才能调用commit方法。 commit方法不能多次调用,否则程序崩溃
*/ // 嵌入ContentFragment
transaction.add(R.id.contentC, new ContentFragment()).commit();
} /**
* 只能在Fragment被嵌入到Activity后才能获取Fragment中的控件
* 因此这里在onStart方法中实现逻辑代码
*/
@Override
protected void onStart()
{
super.onStart(); Button btn = (Button) findViewById(R.id.getContent); btn.setOnClickListener(new View.OnClickListener()
{ @Override
public void onClick(View v)
{
onGetContent();
}
});
} /**
* 实现TitleFragment中内部接口的方法
*/
@Override
public void onGetContent()
{
TextView txtView = (TextView) findViewById(R.id.content);
Toast.makeText(this, txtView.getText().toString(), Toast.LENGTH_SHORT).show();
}
}
运行效果和之前的一样,只是把逻辑都移到了Activity上
使用Fragment创建灵活的用户界面的更多相关文章
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...
- Android 用Fragment创建一个选项卡
本文结合之前的动态创建fragment来进行一个实践,来实现用Fragment创建一个选项卡 本文地址:http://www.cnblogs.com/wuyudong/p/5898075.html,转 ...
- 编写利用Fragment创建新闻列表
编写利用Fragment创建新闻列表 1.创建新闻实体类News,代码如下: public class News { private String title; private String co ...
- java 添加一个线程、创建响应的用户界面 。 演示示例代码
javajava 添加一个线程.创建响应的用户界面 . 演示示例代码 来自thinking in java 4 21章 部分的代码 夹21.2.11 thinking in java 4免费下载: ...
- Android UI开发第三十篇——使用Fragment构建灵活的桌面
http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...
- Android Fragment详解(二):Fragment创建及其生命周期
Fragments的生命周期 每一个fragments 都有自己的一套生命周期回调方法和处理自己的用户输入事件. 对应生命周期可参考下图: 创建片元(Creating a Fragment) To c ...
- android 之fragment创建
1.使用xml标签 1.1定义两个重要属性 <fragment android:id="@+id/fregment_top" android: ...
- Xamarin.Forms入门-使用 Xamarin.Forms 来创建跨平台的用户界面
Xamarin.Forms 是一个跨平台的.基于原生控件的UI工具包,开发人员可以轻松的创建适用于 Android,iOS 以及 Windows Phone的用户界面.Xamarin.Forms 通过 ...
- Fragment 创建 传递参数 跳转 典例
抽取的控制Fragment的父Activity /** * 抽象一个Activity托管我们的Single Fragment */ public abstract class SingleFrag ...
随机推荐
- 项目实战工具类(一):PhoneUtil(手机信息相关)
可以使用的功能: 1.获取手机系统版本号 2.获取手机型号 3.获取手机宽度 4.获取手机高度 5.获取手机imei串号 ,GSM手机的 IMEI 和 CDMA手机的 MEID. 6.获取手机sim卡 ...
- AE影视后期之跳跃音符制作
制作跳动音符 新建项目 a.打开AE b.新建项目打开一张图片 c.新建合成将图片拖动到左下角的合成面板 新建文本图层. a.找到图层选项里面的新建text b.在里面输入IIIIIIIIIIIIII ...
- iOS Xcode, 解决“Could not insert new outlet connection: Could not find any information for the class named”的问题。
在Xcode中,我们可以在StoryBoard编辑界面或者是xib编辑界面中通过“Control键+拖拽“的方式将某个界面元素和对应的代码文件连接起来,在代码文件中创建outlet. 不过,如果你的运 ...
- svn的使用(转载)
这里只介绍使用CornerStone来使用SVN. CornerStone是Mac OS X系统下非常好用的一款svn工具,当然还有Versions也是可以用的,但是使用起来不如CornerStone ...
- 极简MarkDown排版介绍(How to)
如何切换编辑器 切换博客园编辑器为MarkDown:MarkDown Editor 选择一个在线编辑和预览站点:StackEdit 如何排版章节 MarkDown: 大标题 ========== 小标 ...
- SSRS Reports 2008性能优化案例
我们的一个Reporting Service服务上部署了比较多的SSRS报表,其中有一个系统的SSRS报表部署后,执行时间相对较长,加之供应商又在ASP.NET页面里面嵌套了Reporting Ser ...
- 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory
转载http://m.blog.csdn.net/blog/SpbDev/8545372 学习Spring的过程中,一直不理解为何配置的bean的class是LocalSessionFacto ...
- Python基本语法
目录缩进流程控制语句表达式函数对象的方法类型数学运算 缩进Python开发者有意让违反了缩进规则的程序不能通过编译,以此来强制程序员养成良好的编程习惯.并且Python语言利用缩进表示语句块的开始和退 ...
- sk_buff 里的len, data_len, skb_headlen
http://blog.csdn.net/kakadiablo/article/details/7948414 struct sk_buff *skb; skb->len 是data长度,包含所 ...
- nginx 配置php
安装php yum install php yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php ...
