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>

运行代码

就会根据屏幕大小出现最初截图的样子

0 0
原创粉丝点击