标签:android开发
package com.example.android_fragment_1;
import android.app.Activity;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class BookListFragment extends ListFragment {
//1.定义一个回调接口Callback,用于实现该Fragment与它所在的Activity交互(注意:该接口的实现需要在Activit中)
private Callbacks mCallbacks; //Callbacks接口对象
public interface Callbacks
{
public void onItemSelected(Integer id); //参数为Map集合的键
}
//2.onCreate方法中为该ListFragment设置Adapter,让该ListFragment显示该Adapter所提供的多个列表项
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),//
android.R.layout.simple_list_item_activated_1,
android.R.id.text1,
BookContent.ITEMS)); //
}
//3.调用该方法将Fragment添加并显示到Acitvity中
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
//a.如果Activity中没有实现Callbacks接口,抛出异常
if(!(activity instanceof Callbacks))
{
throw new IllegalStateException("异常:BookListFragment所在的Activity必须实现Callback接口!");
}
//把该Activity当成Callbacks对象(就是这一句导致出现NullPointerException错误)
mCallbacks=(Callbacks)activity;
}
//4.当该Fragment从他所属的Acitivity中被删除时,调用该方法
@Override
public void onDetach() {
super.onDetach();
mCallbacks=null; //将mCallbacks赋值为null
}
//5.当用户单击某列表项时激发该回调方法
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
mCallbacks.onItemSelected(BookContent.ITEMS.get(position).id);//激发mCallbacks接口的onItemSelected方法
}
public void setActivateOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE:ListView.CHOICE_MODE_NONE);
}
}package com.example.android_fragment_1;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/*功能:
* 使用Fragment将会显示加载一份简单的界面布局文件,并根据传入的参数来更新
* 界面组件*/
public class BookDetailFragment extends Fragment {
public static final String ITEM_ID="item_id";
BookContent.Book book; //保存该Fragment显示的book对象
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//如果启动该Fragment时包含了ITEM_ID参数,其中 Map containsKey(String Key) 判断key有没有对应的value值; 有,则返回true 没有,则返回false
//从Bundle对象中获取传入的参数(键值对)
if(getArguments().containsKey(ITEM_ID))
{
book=BookContent.ITEM_MAP.get(getArguments().getInt(ITEM_ID));
//获取启动该Fragment时传入的ITEM_ID参数并根据该ID获取BookContent的ITEM_MAP中的图书信息?
}
}
//2.重写该方法:该方法返回的View将作为Fragment显示的组件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//a.加载/res/layout/目录下的fragment_book_detail.xml布局文件,返回一个view目的使该fragment的布局显示在Activity中
View view=inflater.inflate(R.layout.fragment_book_detail, //指明当前fragment的资源文件
container, //父容器控件
false); //表明是否连接该布局和其父容器控件(这里系统已经插入了布局到父容器中)
/*将图书信息中的标题、属性显示在容器的两个文本框中*/
if(book!=null)
{
//b.让book_title文本框显示book对象的title属性
((TextView) view.findViewById(R.id.book_title)).setText(book.title);
//c.让book_desc文本框显示book对象的desc属性
((TextView) view.findViewById(R.id.book_desc)).setText(book.desc);
}
return view;
}
}package com.example.android_fragment_1;
import android.app.Activity;
import android.os.Bundle;
public class SelectBookActivity extends Activity implements BookListFragment.Callbacks
{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//1.加载Activity自己的布局资源/res/layout/main.xml并显示(two panes)
setContentView(R.layout.activity_book_twopane);
}
//2.实现Callbacks接口必须实现的方法,用于实现该Fragment与它所在的Activity交互(即选择点击哪个列表项,向Fragment传入参数id)//更新Activity右边内容
@Override
public void onItemSelected(Integer id) {
//a.创建Bundle,准备向Fragment传入参数
Bundle arguments=new Bundle();
arguments.putInt(BookDetailFragment.ITEM_ID, id); //装入值id到"item_id"键
//b.创建BookDetailFragment对象,并项Fragment传入参数
BookDetailFragment fragment=new BookDetailFragment();
fragment.setArguments(arguments);
//c.使用fragment替换book_detail_container容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.book_detail_container, fragment)
.commit();
/*注释:这一句等价于....
* FragmentManager Manager=getFragmentManager();
* FragmentTransaction Transaction=Manager.beginTransaction();
* Transaction.replace(R.id.book_detail_container, Manager);
* Transaction.commit();
* */
}
}package com.example.android_fragment_1;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BookContent {
//1.定义一个内部类,作为系统的业务对象
public static class Book
{
public Integer id; //Map键
public String title;
public String desc;
public Book(Integer id,String title,String desc)//构造函数,初始化图书详情的"map键,标题,内容"
{
this.id=id;
this.title=title;
this.desc=desc;
}
public String toString()
{
return title;
}
}
//2.使用List集合记录系统所包含的Book对象ITEMS,利用它调用其add(对象)方法项List集合中添加列表项
public static List<Book> ITEMS=new ArrayList<Book>();
//3.使用Map集合记录系统所包含的Book对象ITEM_MAP,利用它调用put(Key,Value)方法向Map集合中添加列表项
public static Map<Integer,Book> ITEM_MAP =new HashMap<Integer,Book>();
static{
//使用静态初始化代码,将Book对象添加到List集合、Map集合中
addItem(new Book(1,"疯狂Android讲义","个人评价:这本书很好,就是有点厚!"));
addItem(new Book(2,"数学之美","个人评价:来自自然语音的使者"));
addItem(new Book(3,"大话数据结构","个人评价:不知道怎样,听说很不错"));
}
private static void addItem(Book book) {
// TODO Auto-generated method stub
ITEMS.add(book); //添加List集合中列表项
ITEM_MAP.put(book.id,book);//添加Map集合中列表项
}
}Android学习笔记十四.深入理解fragment(二) 之《图书详情》实战
标签:android开发
原文地址:http://blog.csdn.net/u012637501/article/details/42395363