您的位置:首页 > 移动开发 > Android开发

android activity与多个fragment之间的瓜葛

2016-12-15 15:38 225 查看

activity与fragment加载并传递参数实践

activity 加载基础fragment

fragment 传递参数给activity

activity 传递参数给fragment

fragment 替换另一个fragment(replace)

fragment 回退栈处理

activity 加载基础fragment

使用 fragmentManage来进行fragment的加载

fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
//加载fragment1
if (fragment1 == null) {
fragment1 = new TravelMessageFragment1();
tx.add(R.id.travelInit, fragment1);
tx.addToBackStack(null);
tx.commit();
}


注意:activity 加载每个fragment 时 必须使用不同的事务,所以每次添加或替换必须再声明次 FragmentTransaction

如下所示:

android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
fragment2 = new TravelMessageFragment2();
tx.replace(R.id.travelInit, fragment2);
tx.addToBackStack(null);
tx.commit();


fragment 传递参数给activity

可以使用2种方式进行传递

使用广播方式

使用回调机制 (可以查看 android回调机制 )

这里就不介绍回调机制如何处理了,着重看数据如何传递

public  interface TravelMessageFragmentListener{
//添加fragment2
void addFragment2(HashMap saveData);
}


这里的saveData 就是需要传递的数据,需要做2件事

fragment 确定什么时候发起传输数据到activity

activity 怎么接收该数据并替换为另一个fragment并传递参数给这个fragment

这里的activity需要实现该接口并重写该方法

public void addFragment2 (HashMap saveData) {
initToolBar();
android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
fragment2 = new TravelMessageFragment2();
tx.replace(R.id.travelInit, fragment2);
tx.addToBackStack(null);
tx.commit();
fragment2.putData(saveData);
}


activity 传递参数给fragment

这里可以使用
fragment2.putData(saveData);
来传递数据

fragment 替换另一个fragment(replace)

android.support.v4.app.FragmentTransaction tx =fragmentManager.beginTransaction();
fragment2 = new TravelMessageFragment2();
tx.replace(R.id.travelInit, fragment2);
tx.addToBackStack(null);
tx.commit();


这里要注意 FragmentTransaction 这个类

在用fragment替换另一个fragment时 要注意

FragmentTransaction 必须再次声明,不然会报

java.lang.IllegalStateException: commit already called

fragment 回退栈处理

fragment 需要记住2个方法

- getBackStackEntryCount

- popBackStack

一个是回退栈的个数 从1开始

另一个是模拟安卓返回键

默认返回栈定元素(peek操作)

所以后退的代码可以如下表示

public void skipBackView(View view) {
if(is_can_back == true) {
//finish();
if(fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStack();
}else {
finish();
}
}
}


获取安卓回退事件(onKeyDown)代码如下:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK ) {
if(is_can_back) {
if(fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStack();
}else {
finish();
}
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android fragment 回退栈