Fragment应用实例
来源:互联网 发布:java源码书籍下载 编辑:程序博客网 时间:2024/06/05 04:39
Fragment一般也叫碎片,常常为了同时适应小屏幕和大屏幕而使用,fragment必须嵌入在activity中使用,其生命周期也受到嵌入的activity生命周期的影响,activity暂停时,fragment也暂停,activity销毁时,fragment也被销毁,fragment的生命周期中较重要的函数大致如下:
onAttach():将fragment嵌入在相应的activity中——对应onDetach():解绑fragment和activity
onCreate()——对应onDestroy
onCreateView():将布局和fragment关联——对应onDestroyView():将布局和fragment解除关联
onActivityCreated()——嵌入的activity布局完成后返回执行该函数
下面列举一个常用的例子说明下fragment的使用方法:在屏幕宽度大于350dp的时候,在同一页面可实现类tab切换,如下截图效果:
当屏幕宽度小于350dp的时候,一个页面呈现不了这么多,就需要两个activity来实现,如下截图:
下面就附上相应的代码:
一.创建News函数,实现设置news标题和news内容的方法及获取方法
package com.example.fragmentmy;
public class News {
String title;
String content;
public void setTitle(String title){
this.title = title;
}
public void setContent(String content){
this.content = content;
}
public String getTitle(){
return title;
}
public String getContent(){
return content;
}
}
二.创建MyAdapter适配器,继承自ArrayAdapter
package com.example.fragmentmy;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class MyAdapter extends ArrayAdapter<News>{
private int ListItemID;
//重写适配器MyAdapter构造函数
public MyAdapter(Context context, int resource, List<News> objects) {
super(context, resource, objects);
ListItemID = resource;
// TODO Auto-generated constructor stub
}
//通过getView函数将滑动在屏幕上的那部分内容视图显示出来
public View getView(int position, View convertView,ViewGroup parent){
View view;
//通过getItem将arraylist中相应位置的数据读取出来存储在news中
News news = getItem(position);
//通过convertView来判断之前该布局是否曾加载过,若加载过,则直接使用,若没有,再填充布局
if(convertView == null){
view=LayoutInflater.from(getContext()).inflate(ListItemID, null);
}else{
view = convertView;
}
//将从相应位置获取的数据设置在屏幕的布局上
TextView titleItem = (TextView)view.findViewById(R.id.list_item);
titleItem.setText(news.getTitle());
return view;
}
}
该适配器对应的布局文件list_item.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:id="@+id/list_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
三.创建TitleFragment
@SuppressLint("NewApi") public class TitleFragment extends Fragment implements OnItemClickListener {
MyAdapter myAdapter;
List<News> newsList;
ListView titleListView;
Boolean isTwoPane;
//将TitleFragment和activity进行关联,并且构建myAdapter对象
public void onAttach(Activity activity){
super.onAttach(activity);
newsList = new ArrayList<News>();
newsList = getNewsList();
myAdapter = new MyAdapter(activity, R.layout.list_item, newsList);
}
//将布局和fragment进行关联,将titleListView绑定myAdapter适配器,并设置监听事件
public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){
View view = inflater.inflate(R.layout.title_fragment, null);
titleListView = (ListView)view.findViewById(R.id.listView);
titleListView.setAdapter(myAdapter);
titleListView.setOnItemClickListener(this);
return view;
}
//设置newsList数据内容
public List<News> getNewsList(){
News news01 = new News();
news01.setTitle("今年高考");
news01.setContent("今年高考作文题:你想说啥说啥吧");
News news02 = new News();
news02.setTitle("取消高考");
news02.setContent("教育部透露将于2020年取消高考");
newsList.add(news01);
newsList.add(news02);
return newsList;
}
//相关联的activity完成布局后执行onActivityCreated函数,判断设备屏幕尺寸,若小于350dp,择isTwoPane为false,反之为true
public void onActivityCreated(Bundle bundle){
super.onActivityCreated(bundle);
if(getActivity().findViewById(R.id.content_framelayout)==null){
isTwoPane =false;
}else {
isTwoPane = true;
}
}
@Override
//listView监听事件,如果是小屏幕,则启动ContentActivity,反之,获取view当中的contentFragment,调用其refresh方法更新contentFragment中内容
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
News news = newsList.get(arg2);
if(isTwoPane){
ContentFragment contentFragment = (ContentFragment)getFragmentManager().findFragmentById(R.id.content_fragment);
contentFragment.refresh(news.getContent());
}else {
ContentActivity.actionStart(getActivity(), news.getContent());
}
}
}
以上TitleFragment相关联的布局文件title_fragment.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" >
<ListView
android:id="@+id/listView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
></ListView>
</LinearLayout>
四.创建ContentFragment
@SuppressLint("NewApi") public class ContentFragment extends Fragment {
View view;
public void onAttach(Activity activity){
super.onAttach(activity);
}
//contentFragment关联content_fragment布局
public View onCreateView(LayoutInflater inflater, ViewGroup container ,Bundle bundle){
view = inflater.inflate(R.layout.content_fragment, null);
return view;
}
//点击TitleFragment中ListView刷新相应ContentFragment内容
public void refresh(String content){
TextView newsContent = (TextView)view.findViewById(R.id.news_content);
newsContent.setText(content);
}
}
对应的布局文件content_fragment.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:id="@+id/news_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
五.创建MainActivity
public class MainActivity extends Activity{
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
相应的activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:baselineAligned="false"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/title_fragment"
android:name ="com.example.fragmentmy.TitleFragment"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="1"
/>
<FrameLayout
android:id="@+id/content_framelayout"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="2" >
<fragment
android:id="@+id/content_fragment"
android:name="com.example.fragmentmy.ContentFragment"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
></fragment>
</FrameLayout>
</LinearLayout>
</LinearLayout>
六.整理下布局文件,见如下目录,有layout和layout-sw350dp两个布局文件夹,当屏幕宽大于350dp时,调用layout-sw350dp文件夹,以上5条内容都是对应宽度大于350dp的
若宽度小于350dp,需要再创建一个ContentActivity及相应的布局文件,如下:
public class ContentActivity extends Activity {
//TitleFragment通过调用actionStart来启动ContentActivity
public static void actionStart(Context context,String newsContent){
Intent intent = new Intent(context,ContentActivity.class);
intent.putExtra("newsContent", newsContent);
context.startActivity(intent);
}
//获取ContentFragment对象,调用改对象的refresh方法更新相应内容
@SuppressLint("NewApi") protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_content);
ContentFragment contentFragment = (ContentFragment)getFragmentManager().findFragmentById(R.id.activity_content);
contentFragment.refresh(getIntent().getStringExtra("newsContent"));
}
}
相应的布局文件activity_content.xml
<RelativeLayout 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" >
<fragment
android:id="@+id/activity_content"
android:name="com.example.fragmentmy.ContentFragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</RelativeLayout>
运行代码
就会根据屏幕大小出现最初截图的样子
- Fragment应用实例
- fragment应用实例二
- Fragment应用实例
- Android Fragment 全面详解+Fragment应用实例
- [Android]Fragment的应用/点击替换fragment应用实例
- fragment实例
- Fragment实例
- Android Fragment应用实战:点击底部栏不懂选项弹不同Fragment实例
- Fragment小实例
- Android Fragment 实例
- Android Fragment实例
- Fragment 实例(1234)
- Fragment 简单实例详解
- Android Fragment实例
- Android组件:Fragment实例
- Android Fragment 简单实例
- Android Fragment实例
- Android Fragment实例
- 欢迎使用CSDN-markdown编辑器
- webuploader-功能强大的HTML5上传组件
- Animy.js,自己编写的功能丰富的html动画库
- codeforces Looksery Cup 2015 D. Haar Features
- 计算机视觉投稿期刊整理
- Fragment应用实例
- POJ 2954-Triangle(计算几何+皮克定理)
- CVS配置和新增用户
- (翻译)开始iOS 7中自动布局教程(二)
- navicat工具把SQL Server数据库转换MySQL数据库
- gae 部署基于flask的web服务器
- Linux中cp和scp命令详解
- Java实现冒泡排序
- C++9.5 vector/list/queue容器的区别与选用