今天做了一个Fragment与Activity之间通信的demo,目标是,(大)屏幕左边通过点击一个图书的title,右边显示图书详情,左右即2个fragment,其中多个fragment可以组成一个activity,一个Fragment可以被多个activity调用。
其中需要2个fragment,一个是选项,一个是显示,选项列表需要一个显示列表的ListFragment,该类无须重写OnCreateView()方法,只需要为他设置Adapter即可(Adapter还不清楚!!)
贴上代码说明“
package com.example.framentandactivity;
import com.example.model.*;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
@SuppressLint("NewApi")
public class BookListFragment extends ListFragment{
private Callbacks mCallbacks;
public interface Callbacks{
public void onItemSelected(Integer id);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/*setListAdapter(new ArrayAdapter<BookContent.Book>)*/
// 为该ListFragment设置Adapter
setListAdapter(new ArrayAdapter<BookContent.Book>(getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, BookContent.ITEMS));
}
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
// 如果Activity没有实现Callbacks接口,抛出异常
if (!(activity instanceof Callbacks))
{
throw new IllegalStateException(
"BookListFragment所在的Activity必须实现Callbacks接口!");
}
// 把该Activity当成Callbacks对象
mCallbacks = (Callbacks)activity;
}
// 当用户点击某列表项时激发该回调方法
@Override
public void onListItemClick(ListView listView,View view ,int position,long id)
{
super.onListItemClick(listView, view, position, id);
// 激发mCallbacks的onItemSelected方法
mCallbacks.onItemSelected(BookContent
.ITEMS.get(position).id);
}
// 当该Fragment从它所属的Activity中被删除时回调该方法
@Override
public void onDetach()
{
super.onDetach();
// 将mCallbacks赋为null。
mCallbacks = null;
}
public void setActivateOnItemClick(boolean activateOnItemClick)
{
getListView().setChoiceMode(
activateOnItemClick ? ListView.CHOICE_MODE_SINGLE
: ListView.CHOICE_MODE_NONE);
}
}
其中Adapter里面需要的数据由model类提供,上面代码贴出来的Fragment的生命周期,和触发选择事件的响应,事件传入了选项的ID,当事件触发,则激发该回调方法。
本实例我理解的流程为:程序先到AndroidMainifest.xml找到程序入口,再通过入口的Activity,Activity开始需要加载一个布局文件,布局文件中有Fragment,该Fragment指定的name为XXXFragment,(就是上面这段代码),这段代码为布局文件提供了数据来显示,和监听事件,再回到入口Activity,加载完布局文件之后,他实现了上面的单击事件的接口,再实现该接口,通过调用另外一个Fragment来找到该图书具体信息,最后再显示到另外一个Fragment里面。