Android Fragment的介绍与使用(案例Demo)
应用场景:
众所了解Android上的界面展示都是通过Activity实现的,可是Activity也有它的局限性,相同的界面在手机上显示可能非常好看,在平板上就未必了。为了让界面能够在平板上更好地展示,Android在3.0版本号引入了Fragment(碎片)功能,它非常类似于Activity,能够像Activity一样包括布局。Fragment一般是嵌套在Activity中使用的。首先须要注意,Fragment是在3.0版本号引入的,假设你使用的是3.0之前的系统,须要先导入android-support-v4的jar包才干使用Fragment功能。
知识点介绍:
一、怎样创建Fragment。
首先须要创建继承Fragment的子类,Fragment类的代码看起来非常像Activity。它与Activity一样都有回调函数,比如onCreate(),onStart(),onPause(),和onStop()。其实,假设你正在将一个现成的Android应用转而使用Fragment来实现,能够简单的将代码从Activity的回调函数移植到各自的Fragment的回调函数中,简单而可行。
Fragment的生命周期方法主要包含例如以下:
1、onAttach
2、onCreate
3、onCreateView
4、onActivityCreated
5、onDestroyView
6、onDestroy
7、onPause
public class TestFragment extends Fragment {
/**当Fragment已经跟Activity关联上的时候,这个回调被调用。Activity会作为onAttach()回调方法的參数来传递*/
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
} /**当创建Fragment时,系统调用该方法
在实现代码中, 应当初始化想要在Fragment中保持的必要组件, 当Fragment被暂停或者停止后能够再次恢复。*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
} /**Fragment第一次绘制它的用户界面的时候, 系统会调用此方法。
为了绘制Fragment的UI, 此方法必须返回一个View, 这个view是你的Fragment布局的根view。*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// R.layout.activity_main 自己定义的布局文件
View view = inflater.inflate(R.layout.activity_main, null);
return view;
// return super.onCreateView(inflater, container, savedInstanceState);
} /**当Activity的onCreate()方法运行完之后,调用这个回调方法。*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
} /**当跟Fragment关联的视图层正在被删除时,调用这个回调方法。*/
@Override
public void onDestroyView() {
super.onDestroyView();
} /**当从Activity中解除Fragment的关联时,调用这个回调方法。*/
@Override
public void onDestroy() {
super.onDestroy();
} /*================================================================*/
/**用户将要离开Fragment时,系统调用这种方法作为第一个指示(然而它不总是意味着Fragment将被销毁。)
在当前用户会话结束之前,通常应当在这里提交不论什么应该持久化的变化(由于用户有可能不会返回)。*/
@Override
public void onPause() {
super.onPause();
}
}
二、怎样将Fragment加入到Activity。
此部分能够參看http://blog.csdn.net/t12x3456/article/details/8104574 这篇文章,博主写的非常详尽。本文主要側重于【在代码中加入Fragment到ViewGroup】的方式。
使用此方法须要了解一下下面三个类对象:
android.support.v4.app.FragmentActivity
android.support.v4.app.FragmentManager
android.support.v4.app.FragmentTransaction
首先我们使用的Activity须要继承(extends)FramentActivtiy。
public class MainActivity extends FragmentActivity然后通过获取FragmentTransaction 对象得到FragmentTransaction来完毕Fragment的事务(比方加入,删除,替换等)操作,最后提交事务。
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment();
transaction.add(R.id.main_frameLayout, fragment);
transaction.commit();
使用方式:
第一步:新建项目FragmentStudy,AndroidManifest.xml例如以下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.fragmentstudy"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar" >
<activity
android:name="com.example.fragmentstudy.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>
第二步:创建ExampleFragment(Fragment的子类)与ExampleFragment对应的布局文件layout_fragment_example.xml。
【layout_fragment_example.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:orientation="vertical" >
<TextView android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="ExampleFragment"
android:gravity="center"
android:id="@+id/fragment_textView"
android:textColor="@android:color/black"/>
</LinearLayout>
【ExampleFragment.java】
import java.util.Date; import android.annotation.SuppressLint;
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.TextView; @SuppressLint("ValidFragment")
public class ExampleFragment extends Fragment{ private String title = "";
public ExampleFragment(String title) {
super();
this.title = title;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { View view = inflater.inflate(R.layout.layout_fragment_example, null);
TextView textView = (TextView) view.findViewById(R.id.fragment_textView);
textView.setText(textView.getText().toString()+"\n"+title+"\n"+new Date().getTime());
// return super.onCreateView(inflater, container, savedInstanceState);
return view;
}
}
第三步:编写activity_main.xml主布局文件与MainActivity.java。
【activity_main.xml】
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:background="@android:color/white"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<FrameLayout android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/main_frameLayout">
</FrameLayout>
<LinearLayout android:layout_height="wrap_content"
android:layout_width="match_parent"
android:layout_alignParentBottom="true"
android:orientation="vertical">
<GridView android:layout_height="wrap_content"
android:layout_width="match_parent"
android:columnWidth="50dp"
android:horizontalSpacing="10dp"
android:id="@+id/main_gridView"
android:numColumns="3">
</GridView>
</LinearLayout>
</RelativeLayout>
【MainActivity.java】
import java.util.ArrayList;
import java.util.List; import com.example.fragmentstudy.adapter.GridAdapter;
import com.example.fragmentstudy.domain.GridInfo; import android.os.Bundle;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
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.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView; public class MainActivity extends FragmentActivity { private GridView gridView;
private List<GridInfo> gridInfos = new ArrayList<GridInfo>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
} private void initViews() {
gridView = (GridView) findViewById(R.id.main_gridView);
GridAdapter gridAdapter = new GridAdapter(MainActivity.this);
getGridOnfoList();
gridAdapter.setList(gridInfos);
gridView.setAdapter(gridAdapter);
gridView.setSelector(new ColorDrawable(Color.TRANSPARENT));
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
ExampleFragment fragment = new ExampleFragment("主功能页面");
transaction.add(R.id.main_frameLayout, fragment);
transaction.commit();
gridView.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
//通过anim xml 配置Fragment切换效果 new / old
//上出下进
transaction.setCustomAnimations(R.anim.push_up_in, R.anim.push_up_out);
GridInfo info = gridInfos.get(arg2);
ExampleFragment fragment = new ExampleFragment(info.getName());
transaction.replace(R.id.main_frameLayout,fragment);
// transaction.addToBackStack(null); //提供返回上一页面的功能
transaction.commit();
}
});
} private void getGridOnfoList() {
for(int i=0;i<6;i++){
GridInfo gridInfo = new GridInfo("測试"+i, R.drawable.ic_launcher+"");
gridInfos.add(gridInfo);
}
}
}
第四步:本演示项目的主要代码如上,一下为辅助的GirdView菜单效果的相关.java文件与.xml文件。
【GridInfo.java】
public class GridInfo {
private String name;
private String appImage;
public GridInfo(String name, String appImage) {
super();
this.name = name;
this.appImage = appImage;
}
public String getAppImage() {
return appImage;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
【GirdAdapter.java】
import java.util.List; import com.example.fragmentstudy.R;
import com.example.fragmentstudy.domain.GridInfo; import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView; public class GridAdapter extends BaseAdapter {
private class GridHolder {
ImageView appImage;
TextView appName;
}
private Context context;
private List<GridInfo> list;
private LayoutInflater mInflater;
public GridAdapter(Context c) {
super();
this.context = c;
}
public void setList(List<GridInfo> list) {
this.list = list;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
GridHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.grid_item, null);
holder = new GridHolder();
holder.appImage = (ImageView)convertView.findViewById(R.id.itemImage);
holder.appName = (TextView)convertView.findViewById(R.id.itemText);
convertView.setTag(holder);
}else{
holder = (GridHolder) convertView.getTag();
}
GridInfo info = list.get(position);
if (info != null) {
holder.appName.setText(info.getName());
int colorInt = Color.parseColor("#CCFF66");
if(position%6==1){
colorInt = Color.parseColor("#336699");
} else if (position%6==2) {
colorInt = Color.parseColor("#663366");
}else if (position%6==3) {
colorInt = Color.parseColor("#ABCDEF");
}else if (position%6==4) {
colorInt = Color.parseColor("#669933");
}else if (position%6==5) {
colorInt = Color.parseColor("#CC3399");
}
holder.appImage.setBackgroundColor(colorInt);
holder.appName.setTextColor(Color.BLACK);
holder.appName.setGravity(Gravity.CENTER);
}
return convertView;
}
}
【grid_item.xml】
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="4dip" >
<ImageView
android:id="@+id/itemImage"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerHorizontal="true" >
</ImageView>
<TextView
android:id="@+id/itemText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/itemImage"
android:layout_centerHorizontal="true"
android:layout_marginTop="4dp"
android:gravity="center"
android:text="TextView01"
android:textColor="@android:color/black"
android:textSize="10dp" >
</TextView>
</RelativeLayout>
除此之外还须要两个动画效果文件res/anim下的push_up_in.xml、push_up_out.xml。
【push_up_in.xml】
<?xml version="1.0" encoding="utf-8"?>
<!-- 上滑切入 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0%p" android:toXDelta="0%p"
android:fromYDelta="100%p" android:toYDelta="0%p"
android:duration="1000" />
</set>
【push_up_out.xml】
<?xml version="1.0" encoding="utf-8"?>
<!-- 上滑切出 -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/decelerate_interpolator">
<translate
android:fromXDelta="0%p" android:toXDelta="0%p"
android:fromYDelta="0%p" android:toYDelta="-100%p"
android:duration="1000" />
</set>
页面效果:
下载地址:
Android Fragment的介绍与使用(案例Demo)的更多相关文章
- Android Fragment 基本介绍
Fragment 源码:http://www.jinhusns.com/Products/Download/?type=xcj Android是在Android 3.0 (API level 11)开 ...
- Android Fragment 基本介绍[转]
Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的 ...
- 【转】Android Fragment 基本介绍--不错
原文网址:http://www.cnblogs.com/mengdd/archive/2013/01/08/2851368.html Fragment Android是在Android 3.0 (AP ...
- [原]Android Fragment 入门介绍
Fragment Fragment 产生,优点,用途,使用方法简介 1 Fragmeng简介 自从Android 3.0中引入fragments 的概念,根据词海的翻译可以译为:碎片.片段.其上的是为 ...
- Android Fragment 简单实例
Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...
- Android Fragment 实例
Fragment是Android honeycomb 3.0新增的概念,在Android——Fragment介绍.Android Fragment使用.Android FragmentManage F ...
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...
- Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误
嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...
随机推荐
- hdu 4861 Couple doubi(数论)
题目链接:hdu 4861 Couple doubi 题目大意:两个人进行游戏,桌上有k个球,第i个球的值为1i+2i+⋯+(p−1)i%p,两个人轮流取,假设DouBiNan的值大的话就输出YES, ...
- SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
问题的原因是无法找到org.slf4j.impl.StaticLoggerBinder,我找了一下,确实没有该类,网上搜了一下下面是官方的解答http://www.slf4j.org/codes.ht ...
- 11g r2 模拟OCR和voting disk不可用,完整恢复过程,以及一些注意事项
环境:RHEL5.8 RAC 11.2.0.3.0 1:查看ORC和voting disk信息: In 11g Release 2 your voting disk data is automatic ...
- java.exe路径问题
因为要更换JDK版本,自然也就要重新设置JAVA_HOME环境变量,但设置完成后奇怪的发现,运行java -version时还是原来的版本,莫名其妙,最后我把JAVA_HOME环境变量删除竟然java ...
- Delphi中拖动无边框窗口的5种方法
1.MouseMove事件中加入: // ReleaseCapture;// Perform(WM_SYSCOMMAND, $F017 , 0); 2.MouseDown事件中加入: // POSTM ...
- boost::asio async_write也不能保证一次发完所有数据 二
只有看boost源码才能弄明白发生了什么.首先我是将vector里面写入了数据,然后用boost::asio::buffer将vector构造成了mutable_buffer_1对象. 参考该文档的重 ...
- redhat6.3 jfreechar中文乱码解决途径
最近使用到jfreechar的项目,在转移到linux上面时出现中文乱码(中文被显示为框框),网上查了一些资料,结合自身系统的特性,总结了一种安装字体的方式.在说字体安装之前首先上个测试的代码吧:we ...
- Struts2图片文件上传,判断图片格式和图片大小
1. 配置Struts2能够上传的最大文件大小 使用Struts2进行文件上传的时候,Struts2默认文件大小最大为2MB,如果要传大一点的文件,就需要修改struts.xml配置文件,重新设置能够 ...
- 使用Iterator遍历Sheet(POI)验证及解释结果有序性
test.xlsx: Code: package poi; import static org.junit.Assert.*; import java.io.IOException; import j ...
- UVA 116 Unidirectional TSP(dp + 数塔问题)
Unidirectional TSP Background Problems that require minimum paths through some domain appear in ma ...