三个java文件+
一个layout文件
入口MainActivity.java
implements Myfragment的接口。(当用户点击Fragment Item时,回调Activity中方法)
接口方法 执行new MyFragment() ,并显示在右侧。
layout.xml
一个Fragment和一个FrameLayout,width比例:1:3.
ManyBooks.java
静态实体类
MyFragment.java
package com.example.andrid_test_1212;
import com.example.andrid_test_1212.ManyBooks;
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 MyFragment extends ListFragment
{
public static final String ITEM_NAME = "item_name";
private Callbacks mCallbacks;
private ManyBooks.Book book;
/*
* 标记是左侧还是右侧Fragment
*/
private boolean isLeft = true;
// 定义一个回调接口,该Fragment所在Activity需要实现该接口
// 该Fragment将通过该接口与它所在的Activity交互
public interface Callbacks {
public void onItemSelected(Integer id);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
// 这是右侧的Fragment
// 仅展示展示图书详情
if (bundle != null) {
Integer integer = bundle.getInt(ITEM_NAME);
book = ManyBooks.ITEM_MAP.get(integer);
String[] strings = new String[] { book.desc };
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
getActivity(),
android.R.layout.simple_list_item_activated_1, strings);
setListAdapter(arrayAdapter);
isLeft = false;
} else {
// 左侧的Fragment
// 设置Fragment的Adapter
isLeft = true;
ArrayAdapter<ManyBooks.Book> bookAdapter = new ArrayAdapter<ManyBooks.Book>(
getActivity(),
android.R.layout.simple_list_item_activated_1,
android.R.id.text1, ManyBooks.ITEMS);
setListAdapter(bookAdapter);
}
}
// 当该Fragment被添加、显示到Activity时 回调
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Acitivity未实行CallBacks,抛出异常。
boolean bo = activity instanceof Callbacks;
if (bo) {
} else {
throw new IllegalStateException("MainActivity必须实现Callbacks接口!");
}
// 把该Activity当成Callbacks对象
mCallbacks = (Callbacks) activity;
}
// 当该Fragment从它所属的Activity中被删除时回调该方法
@Override
public void onDetach() {
super.onDetach();
// 将mCallbacks赋为null。
mCallbacks = null;
}
// 点击列表项,回调本method
@Override
public void onListItemClick(ListView listView, View view, int position,
long id) {
super.onListItemClick(listView, view, position, id);
if (isLeft) {
// mCallbacks的onItemSelected方法
mCallbacks.onItemSelected(ManyBooks.ITEMS.get(position).id);
}
}
/*
* 这个方法从未用过
*/
public void setActivateOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(
activateOnItemClick ? ListView.CHOICE_MODE_SINGLE
: ListView.CHOICE_MODE_NONE);
}
}
ManyBooks.java
package com.example.andrid_test_1212;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ManyBooks {
/*
* 静态内部类
*/
public static class Book {
public Integer id;
public String title;
public String desc;
public Book(Integer id, String title, String desc) {
this.id = id;
this.title = title;
this.desc = desc;
}
@Override
public String toString() {
return title;
}
}
// 存各种book的list
public static List<Book> ITEMS = new ArrayList<Book>();
// book 对应Map
public static Map<Integer, Book> ITEM_MAP = new HashMap<Integer, Book>();
static {
// 静态代码块,什么时候初始化?
// 加载阶段。先初始化static variables
// 再次初始化 static{}
addItem(new Book(1, "李刚的讲义", "好像很牛。"));
addItem(new Book(2, "Android讲义2", "更牛"));
addItem(new Book(3, "低调哥", "好像很牛。"));
addItem(new Book(4, "高调哥", "更牛"));
}
private static void addItem(Book book) {
ITEMS.add(book);
ITEM_MAP.put(book.id, book);
}
}
MainActivity.java
package com.example.andrid_test_1212;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.os.Bundle;
public class MainActivity extends Activity implements
MyFragment.Callbacks {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 加载/res/layout目录下的activity_book_twopane.xml布局文件
//layout文件中,已有一个fragment
setContentView(R.layout.activity_book_twopane);
}
// 实现Callbacks接口必须实现的方法
@Override
public void onItemSelected(Integer id) {
// 向Fragment传递参数
Bundle bundle = new Bundle();
//MyFragment.ITEM_NAME的值:item_name
//id为1,2,3,4
bundle.putInt(MyFragment.ITEM_NAME, id);
// 创建MyFragment对象
MyFragment fragment = new MyFragment();
// 提供构造参数
fragment.setArguments(bundle);
// 使用fragment替换book_detail_container容器当前显示的Fragment
FragmentTransaction fragmentTransaction = getFragmentManager()
.beginTransaction();
//R.id.book_detail_container的Fragment将被替换
//新的Fragment
fragmentTransaction.replace(R.id.book_detail_container, fragment)
.commit();
}
}
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个水平排列的LinearLayout,并指定使用中等分隔条 -->
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:showDividers="middle">
<!-- 添加一个Fragment -->
<fragment
android:name="com.example.andrid_test_1212.MyFragment"
android:id="@+id/book_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- 添加一个FrameLayout容器 -->
<FrameLayout
android:id="@+id/book_detail_container"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3" />
</LinearLayout>