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 }

浙公网安备 33010602011771号