Activity 和 Fragment 的交互

来源:互联网 发布:安畅网络 程小中 编辑:程序博客网 时间:2024/04/28 20:33

FramentLayout 和 RadioGroup 的配合使用 以及 Fragment 和 Activity 之间的通信

我们的 app 的整体是一个 Activity ,在 Activity 加载的布局里面我们都是使用 FrameLayout 和 RadioGroup 配合的使用来显示不同数据的展示.但是在使用过程中我们 即可以使用 replace() 来替换界面,也可以使用 FragmentTransaction 的事物管理 使用 add() hide() show() 显示界面,但是这两种有事吗区别呢?

在使用 replace() 方法的过程中我们发现了我们 replace() 每次去替换界面的时候 Fragmetn 都是重新创建了一样,因为我们每次replace()到下一个界面在 replace()回来的时候总是发现我们的 界面重新创建了,这样我们上次滑动的记录就没有了,这样给用户的体验也就不好. 在使用 replace()的时候通过 打印 fragment 生命周期 logcat 我发现每次 replace() 方法 Framgnet都是重新走了一遍生命周期也就是从新创建了 . 在通过使用 add() hide() show() 来显示的时候我们发现这个很好的解决了 replace() 的缺点.

在点击 add() 进去以后我们看见 源码的注释是这样说的

向这个活动状态的 Activity 添加一个 Fragmetn, 这个 Framgnet 同样可以有自己的 view, 插入到这个Activity view容器里面

Add a fragment to the activity state. This fragment may optionally
also have its view (if {@link Fragment#onCreateView Fragment.onCreateView}
returns non-null) inserted into a container view of the activity.
public abstract FragmentTransaction add(int containerViewId, Fragment fragment, String tag);

在点击 show() 方法进去

显示一个预先隐藏的fragment,这个添加到容器里面的 views 只能个这个 Fragments 关联 ,因为这将引起这个 view 去显示  

Shows a previously hidden fragment. This is only relevant for fragments whose
views have been added to a container, as this will cause the view to
be shown.
public abstract FragmentTransaction show(Fragment fragment);

hide()

隐藏存在的 fragment, 这个已经添加到容器里面的 view 只能和这个 Fragment 关联,因为这将引起这个 view 发生 隐藏

Hides an existing fragment. This is only relevant for fragments whose
views have been added to a container, as this will cause the view to
be hidden.
public abstract FragmentTransaction hide(Fragment fragment);

通过以上的说明我们就可以通过 这三个方法来控制 fragment 的显示和隐藏 不用每次都去重新创建 fragment

一下是示例代码` private void switchFragment(int index) {    //通过 FramgentManager 获得事物管理 与事物进行绑定    FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();//事物管理    // 先Framgetn 显示之前我们需要做一些重要的操作,那就是 隐藏已经全部显示的Fragment .防止Fragment的显示从重叠    hideFragment(fragmentTransaction); /*   HomeFragment homeFragment = new HomeFragment();  //使用 replace 来替换 不同的Framgent显示,是很耗费资源的,还有也不利于数据的展示.    fragmentTransaction.replace(R.id.main_FrameLayout,homeFragment);// replace() 方法  每使用一次就要重新创建Framgnet .    fragmentTransaction.commit();     FragmentTransaction 这个类里面能给我们提供了 三个方法 ,分别是 hide() add()  show()*/    switch (index) {        case 0:            if (mHomeFragment == null) {//如果Fragment 是null 我们就创建并添加到 事物里面                mHomeFragment = new HomeFragment();                fragmentTransaction.add(R.id.main_FrameLayout, mHomeFragment);            } else {                fragmentTransaction.show(mHomeFragment);  // 不是 null 直接显示            }            break;        case 1:            if (mCourseFragment == null) {                mCourseFragment = new CourseFragment();                fragmentTransaction.add(R.id.main_FrameLayout, mCourseFragment);            } else {                fragmentTransaction.show(mCourseFragment);            }            break;        case 2:            if (mFindFragment == null) {                mFindFragment = new FindFragment();                fragmentTransaction.add(R.id.main_FrameLayout, mFindFragment);            } else {                fragmentTransaction.show(mFindFragment);            }            break;        case 3:            if (mMineFragment == null) {                mMineFragment = new MineFragment();                fragmentTransaction.add(R.id.main_FrameLayout, mMineFragment);            } else {                fragmentTransaction.show(mMineFragment);            }            break;    }    fragmentTransaction.commit();//在这里我们和 replace() 方法的使用一样要进行 conmmit(),在写代码的时候我在这里就忘记写了}`

以上是 add() show() 是我把 hide() 给抽取出来了 ,在我们每次去显示的时候我们都要先把显示的 framgent 要先给隐藏, 要是不这样做就容易出现 fragment 重叠的现象.

### 示例代码:` /** * 隐藏正在显示的Fragment 防止重叠显示 * * @param fragmentTransaction 事物管理 */private void hideFragment(FragmentTransaction fragmentTransaction) {    if (mHomeFragment != null) {        fragmentTransaction.hide(mHomeFragment);        Log.i(TAG, "隐藏mHomeFragment");    }    if (mCourseFragment != null) {        Log.i(TAG, "隐藏mCourseFragment");        fragmentTransaction.hide(mCourseFragment);    }    if (mFindFragment != null) {        Log.i(TAG, "隐藏mFindFragment");        fragmentTransaction.hide(mFindFragment);    }    if (mMineFragment != null) {        Log.i(TAG, "隐藏mMineFragment");        fragmentTransaction.hide(mMineFragment);    }}`

以上就是 FramentLayout 和 RadioGroup 的配合使用 下面我们来说说 Fragment 和 Activity之间的通信

fragment和 ACtivty之间的通信

在 Activity 里面我们要获取 fragment 里面的数据 可以通 要获取的要获取内容的Framgnet的实例来获取 自身里面的数据,以下是获取的 fragment 对象,但是自身要做强转向下转型转成你的fragment的实例

DemoFragment fragment =(DemoFragment) getFragmentManager().findFragmentById(int FragmentID);

Fragment 和 Fragmet 之间的通信呢

Fragment 和 Fragmetn 之间你要通过当前的Framgent 获取与之对应的活动 (Activity)的实例,通过活动的实例获取另一个碎片的实例,就可以调用里面的方法了

` MineFragment mineFragment = (MineFragment)((MainActivity) getActivity()).getFragmentManager().findFragmentById(R.id.main_FrameLayout);            TextView textView = mineFragment.get();`//在HomeFragment里面调用 MineFragment里面的方法

这里写图片描述
这里附上Demo地址
演示Demo

0 0