Android Fragment 和 Activity 实例(Fragment 四 )

1、这个实例几乎包含了Fragment中的所有的内容

2、我们最终的实现效果是:

在主布局的左边是一个ListFragment,这个Fragment是通过使用<fragment.../>静态加载的,  右边也是一个普通的Fragment,他是通过replace()方法动态加载的

当我们点击左面的某个选项时,右面的Frament就会显示这个项目的详细说明文字

3、这就涉及到了两个Fragment之间的通信问题,在之前已经讲过了

 

【代码】


废话少说,直接上代码

【第一步:创建数据类】

ItemsContent.java文件

这个类是专门用于保存各个选项的数据的类,当我们需要使用数据时,都通过这个类来获得的,这样的话均能够够实现   “数据和界面的分离”

 1 package com.penglee.fragment_community_test;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 //这个类是专门用于保存每个项目的数据内容的,当我们需要用到数据的时候,就访问这个类中的内容
 9 public class ItemsContent {
10     
11     //定义每个项目的属性,注意这个是静态的
12         public static class Item{
13             int icon ;
14             String title ;
15             String description ;
16             
17             public Item(int icon , String title , String description){
18                 this.icon = icon ;
19                 this.title = title ;
20                 this.description = description ;
21             }        
22         }
23     
24     //用List保存数据
25     public static List<Item> contentList = new ArrayList<Item>() ;
26     //Map保存数据
27     public static Map<String , Item> contentMap = new HashMap<String ,Item>();
28     
29     //添加数据项
30     public static void addItemContent( Item item){
31         contentList.add(item);
32         contentMap.put(item.title, item);
33     }
34     
35     
36     //进行数据的静态填充
37     static{
38         addItemContent(new Item(R.drawable.date , "Date" ,  "日历表在字盘上开一个小窗,"
39                 + "以数字指示一个月的三十一日,具备这一功能的就是日历表,因为称为date。"
40                 + "日期指示大多采用数字式 ,但也有指针式的指示,由日期指针指示分布在表面上的数字。"
41                 + "另外,有星期指示者,因为称为day。除了日期和星期之外,还有指示月份名 称者,"
42                 + "一般称之为“全日历表”(Full Calendar)。由于月有大小之分,所以在一般的日历表上,"
43                 + "需要加设日历调整装置"));
44         addItemContent(new Item(R.drawable.facebook , "FaceBook " , "Facebook(脸谱)"
45                 + "是创办于美国的一个社交网络服务网站,于2004年2月4日上线。"
46                 + "主要创始人为美国人马克·扎克伯格。Facebook是世界排名领先的照片分享站点,"
47                 + "截至2013年11月每天上传约3.5亿张照片。截至2012年5月,Facebook拥有约9亿用户"));
48         addItemContent(new Item(R.drawable.google , "Google" ,"1998年9月4日,Google以私营公司的形式创立,"
49                 + "设计并管理一个互联网搜索引擎“Google搜索”;"
50                 + "Google网站则于1999年下半年启用。Google的使命是整合全球信息,"
51                 + "使人人皆可访问并从中受益。Google是第一个被公认为全球最大的搜索引擎,"
52                 + "在全球范围内拥有无数的用户"));
53         addItemContent(new Item (R.drawable.set, "Set" , "对信息进行设置"));
54         addItemContent(new Item(R.drawable.time , "Time" , "时间是物理学中的七个基本物理量之一,"
55                 + "符号t。在国际单位制(SI)中,时间的基本单位是秒,符号s,"
56                 + "在1967年召开的第13届国际度量衡大会对秒的定义是:铯-133的原子基态的两个超精细能阶间"
57                 + "跃迁对应辐射的9,192,631,770个周期的持续时间。这个定义提到的铯原子必须在绝对零度时是静止的,"
58                 + "而且在地面上的环境是零磁场。在这样的情况下被定义的秒,与天文学上的历书时所定义的秒是等效的") );
59         addItemContent(new Item(R.drawable.twitter, "Twitter" , "Twitter是一个广受欢迎的社交网络及微博客服务的网站,"
60                 + "允许用户将自己的最新动态和想法以移动电话中的短信息形式(推文)发布(发推),可绑定IM即时通讯软件。"
61                 + "所有的Twitter消息都被限制在140个字符之内。2006年,博客技术先驱创始人埃文·威廉姆斯(Evan Williams)"
62                 + "创建的新兴公司Obvious推出了大围脖服务。"
63                 + "在最初阶段,这项服务只是用于向好友的手机发送文本信息"));
64     }
65 }

 

【第二步:创建两个Fragment】
之后创建左面的ListFragment文件

 ItemsListFragment.java

 1 package com.penglee.fragment_community_test;
 2 
 3 import android.app.Activity;
 4 import android.app.ListFragment;
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.ListView;
 8 
 9 public class ItemsListFragment extends ListFragment {
10     
11     
12     ListAdapter listAdapter ;
13     OnItemClickedListener onClickedListener ;
14     
15     //为ListFragment和Activity之间的通信设置内部接口
16     public interface OnItemClickedListener{
17         
18         public void OnItemClicked( int position ) ;
19         
20     }
21     
22 
23     //将加载当前的ListFragment , 并且实现了OnItemClickedListener接口的Activity转换为
24     //当前ListFragment的内部可用的OnItemClickedListener对象
25     @Override
26     public void onAttach(Activity activity) {
27         super.onAttach(activity);
28         
29         if(activity instanceof OnItemClickedListener){
30             onClickedListener = (OnItemClickedListener) activity ;
31         }
32         
33     }
34 
35     //对变量进行初始化
36     @Override
37     public void onCreate(Bundle savedInstanceState) {        
38         super.onCreate(savedInstanceState);
39         
40         //为当前的ListFragment设置Adapter
41         listAdapter = new ListAdapter(getActivity());
42         setListAdapter(listAdapter);
43         
44     }
45 
46     @Override
47     public void onDetach() {
48         super.onDetach();
49         
50         onClickedListener = null ;
51     }
52     
53     //当当前的ListFragment中的某项被点击时,这个方法被回调
54     @Override
55     public void onListItemClick(ListView l, View v, int position, long id) {
56         super.onListItemClick(l, v, position, id);
57         
58         //调用接口方法
59         onClickedListener.OnItemClicked(position) ;
60     }
61     
62 }

ListAdapter.java文件

 1 package com.penglee.fragment_community_test;
 2 
 3 import android.content.Context;
 4 import android.view.LayoutInflater;
 5 import android.view.View;
 6 import android.view.ViewGroup;
 7 import android.widget.BaseAdapter;
 8 import android.widget.TextView;
 9 
10 //这个ListAdapter使用来为ItemsListFragment设置Adapter的
11 public class ListAdapter extends BaseAdapter{
12     
13     Context context ;
14     
15     public ListAdapter(Context context){
16         this.context = context ;
17     }
18 
19     @Override
20     public int getCount() {
21     
22         return ItemsContent.contentList.size() ;
23     }
24 
25     @Override
26     public Object getItem(int position) {
27         
28         return ItemsContent.contentList.get(position);
29         
30     }
31 
32     @Override
33     public long getItemId(int position) {
34         return position;
35     }
36 
37     @Override
38     public View getView(int position, View convertView, ViewGroup parent) {
39         View view = LayoutInflater.from(context).inflate(R.layout.menu_item, parent, false);
40         ((TextView) view ).setText(((ItemsContent.Item)getItem(position)).title) ;
41         ((TextView) view).setCompoundDrawablesWithIntrinsicBounds(((ItemsContent.Item)getItem(position)).icon,0,0,0) ;
42         return view;
43     }
44 
45 }

menu_item.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="wrap_content"
 5     android:textSize="18sp"
 6      android:textColor="#FFFFFFFF"
 7     android:gravity="center_vertical"
 8     android:drawablePadding="16dp"
 9     android:paddingTop="8dp"
10     android:paddingBottom="8dp"
11     android:paddingStart="16dp"
12     android:paddingEnd="16dp">
13     
14 
15 </TextView>

现在创建右面的Fragment
ItemDetailFragment.java文件

 1 package com.penglee.fragment_community_test;
 2 
 3 import android.app.Fragment;
 4 import android.os.Bundle;
 5 import android.view.LayoutInflater;
 6 import android.view.View;
 7 import android.view.ViewGroup;
 8 import android.widget.TextView;
 9 
10 
11 //项目详情Fragment,也就是显示在右面的Fragment
12 public class ItemDetailFragment extends Fragment{
13 
14     //保存Activity通过setArgument(Bundle)传过来的用于初始化当前Fragment的参数,这个参数保存的是在左边的
15     //ListFragment被点击的位置
16     int position ; 
17     
18     @Override
19     public void onCreate(Bundle savedInstanceState) {
20         
21         super.onCreate(savedInstanceState);
22         if(getArguments().containsKey("ITEM_POSITION")){
23             this.position = getArguments().getInt("ITEM_POSITION");
24         }
25         
26     }
27 
28     @Override
29     public View onCreateView(LayoutInflater inflater, ViewGroup container,
30             Bundle savedInstanceState) {
31         View view = inflater.inflate(R.layout.item_detail, container, false);
32         ((TextView)view).setText(ItemsContent.contentList.get(position).description);
33         return view ;
34     }    
35 }

item_detail.xml

1 <?xml version="1.0" encoding="utf-8"?>
2 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
3     android:layout_width="match_parent"
4     android:layout_height="match_parent" 
5     android:layout_gravity="center"
6     android:textSize="15sp"
7     android:textColor="#FFFFFFFF">
8     
9 </TextView>

 

【第三步:完成Activity和Fragment的加载】

好了现在两个Fragment都已经创建好了,之后就要加载他们了
主布局文件activity_main.xml

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="horizontal"
 6     android:background="@drawable/background"
 7     tools:context="com.penglee.fragment_community_test.MainActivity" >
 8 
 9     <fragment 
10         android:id="@+id/fragment_left"
11         android:name="com.penglee.fragment_community_test.ItemsListFragment"
12         android:layout_width="0dp" 
13         android:layout_height="match_parent"
14         android:layout_weight="2"/>
15     
16     <FrameLayout 
17         android:id="@+id/frameLayout"
18         android:layout_width="0dp"
19         android:layout_height="match_parent"
20         android:layout_weight="5">
21         
22     </FrameLayout>
23 
24 </LinearLayout>

主Activity文件 MainActivity

 

 1 package com.penglee.fragment_community_test;
 2 
 3 import com.penglee.fragment_community_test.ItemsListFragment.OnItemClickedListener;
 4 
 5 import android.app.Activity;
 6 import android.os.Bundle;
 7 
 8 public class MainActivity extends Activity implements OnItemClickedListener {
 9 
10     @Override
11     protected void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.activity_main) ;
14     }
15 
16     //实现ListFragment内部接口的方法
17     @Override
18     public void OnItemClicked(int position) {
19         
20         //封装要传给右边的Fragment的参数
21         Bundle arguments = new Bundle() ;
22         arguments.putInt("ITEM_POSITION", position);
23         
24         //创建ItemDetailFragment对象,并将参数传递给他
25         ItemDetailFragment fragment_right = new ItemDetailFragment() ;
26         fragment_right .setArguments( arguments);
27         
28         //将创建的Fragment换进Activity主布局文件中的FrameLayout容器中
29         getFragmentManager().beginTransaction()
30                          .replace(R.id.frameLayout, fragment_right)
31                          .commit();
32     }
33 }

 

posted @ 2014-12-13 17:38  RoperLee  阅读(381)  评论(0)    收藏  举报