把Fragment与Activity建立联系:
* 静态Fragment:在布局中增加<fragment>标签,通过class属性指定Fragment
* 动态Fragment:在Activity通过FragmentManager和FragmentTransaction管理Fragment
大部分情况下,建议使用动态Fragment
当使用动态Fragment时,可在Activity中使用如下方法来建立管理
FragmentManager fragmentManager = this.getFragmentManager();
FragmentTransaction tranaction = fragmentManager.beginTransaction();
当需要切换Fragment时,使用如下方法来切换
MyFragment fragment = new MyFragment();
transaction.replace(R.id.layout, fragment, "myFragment");
transaction.commit();
Fragment中通过getActivity()获得当前所处的activity对象
MainActivity activity = (MainActivity)getActivity();
ListView listView = (ListView)activity.findViewById(R.id.listview);
activity可以通过FragmentManager中的方法查找到Fragment
FragmentManager manager = getFragmentManager();
MyFragment fragment = (MyFragment)manager.findFragmentById(R.id.my_fragment);
FragmentManager只能对Fragment进行查找、提取等操作
如果希望进行添加删除修改的操作,需要使用FragmentTransaction
FragmentManager对象通过如下方法可以获取FragmentTransaction
FragmentTransaction tranaction = fragmentManager.beginTransaction();
FragmentTransaction在事务提交前,可以把Fragment添加后退栈
addToBackStack(String name)
添加到后退栈后,如果进行后退的操作,就会返回前一个fragment,而不是直接退出应用了
综合:
FragmentManager manager = this.getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
MyFragment fragment = new MyFragment();
transaction.add(R.id.linearlayout, fragment);
transaction.addToBackStack(null);
transaction.commit();
DialogFragment中通过如下方法显示对话框
show(FragmentManager manager, String tag)
show(FragmentTransaction transaction, String tag)
例:
private ListView listview;
private ArrayAdapter<String> adapter;
private List<String> title; // 文章的标题
private List<String> content; // 文章的内容
private FragmentActivity activity; // 注意是FragmentActivity
// 定义FragmentManager和FragmentTransaction对象
private FragmentManager manager; // 管理一个个的Fragment
private FragmentTransaction transaction;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// 通过inflater把layout中的布局转换成view
View view = inflater.inflate(R.layout.left, null);
// 添加title数据
title = new ArrayList<String>();
title.add("序言");
title.add("第一章");
title.add("第二章");
// 添加content数据
content = new ArrayList<String>();
content.add("0000000");
content.add("1111111");
content.add("2222222");
// 创建adapter对象
activity = (FragmentActivity) getActivity(); // 获得Fragment对应的activity
// 1. 获取FragmentManager对象
manager = activity.getSupportFragmentManager();
adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_list_item_1, title);
// 设置listview显示的数据
// listview = (ListView) view.findViewById(R.id.listview);
// listview.setAdapter(adapter);
setListAdapter(adapter); // ListFragment中的方法
return view;
}
// ListFragment特有的重写方法
// 当List中一项被点击时 调用
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
FragmentRight right = new FragmentRight();
switch (position) {
case 0:
// 给Fragment传递参数
Bundle args0 = new Bundle();
args0.putString("content", content.get(0));
right.setArguments(args0);
// 2 在合适的时候开始交易(点击按钮 触发事件……)
transaction = manager.beginTransaction();
// 3 添加对应的动态Fragment
transaction.replace(R.id.right, // 动态fragment要添加到的地方(activity_main中的id)
right, // 待添加的动态fragment对象
"right"); // fragment的标签
// 4 把当前fragment添加到后退栈中(可选 建议添加)按BACK时可以退回到上一个Fragment
transaction.addToBackStack(null);
// 5 提交
transaction.commit();
break;
case 1:
Bundle args1 = new Bundle();
args1.putString("content", content.get(1));
right.setArguments(args1);
// 2 在合适的时候开始交易(点击按钮 触发事件……)
transaction = manager.beginTransaction();
// 3 添加对应的动态Fragment
transaction.replace(R.id.right, // 动态fragment要添加到的地方(activity_main中的id)
right, // 待添加的动态fragment对象
"right"); // fragment的标签
// 4 把当前fragment添加到后退栈中(可选 建议添加)按BACK时可以退回到上一个Fragment
transaction.addToBackStack(null);
// 5 提交
transaction.commit();
break;
case 2:
Bundle args2 = new Bundle();
args2.putString("content", content.get(2));
right.setArguments(args2);
// 2 在合适的时候开始交易(点击按钮 触发事件……)
transaction = manager.beginTransaction();
// 3 添加对应的动态Fragment
transaction.replace(R.id.right, // 动态fragment要添加到的地方(activity_main中的id)
right, // 待添加的动态fragment对象
"right"); // fragment的标签
// 4 把当前fragment添加到后退栈中(可选 建议添加)按BACK时可以退回到上一个Fragment
transaction.addToBackStack(null);
// 5 提交
transaction.commit();
break;
}
super.onListItemClick(l, v, position, id);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.right, null);
Bundle bundle = getArguments();
String content = bundle.getString("content");
TextView textview = (TextView) view.findViewById(R.id.textview);
textview.setText(content);
return view;
}
效果图:
class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("标题");
builder.setMessage("内容");
AlertDialog dialog = builder.create();
return dialog;
}
}