关于Fragment的一些使用心得-跳转和返回栈实战浅析

节选自:关于Fragment的一些使用心得-跳转和返回栈实战浅析


先说fragment之间的跳转吧!

我的项目中首先是一个activity,在该活动中添加了一个fragmentA,然后需要从fragmentA跳转到fragmentB,那么我的实现方法如下:

// 设置标题右侧文字及单击事件监听
activity.setTitleRight("添加", new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        AddPlanFragment fragment = new AddPlanFragment();// 创建AddPlanFragment对象
        showFragment(PlanListFragment.this, fragment);// 跳转添加计划界面
    }
});
/**
 * 碎片之间的跳转
 *
 * @param fragment_current 当前fragment
 * @param fragment_next    跳转后显示的fragment
 */
private void showFragment(Fragment fragment_current, Fragment fragment_next) {
    // 获取FragmentTransaction对象
    FragmentTransaction transaction = ((WorkPlanActivity) context)
            .getSupportFragmentManager().beginTransaction();
    if (fragment_next.isAdded()) {
        // 如果fragment_next已经添加过了,那么直接隐藏fragment_current,显示fragment_next
        transaction
                .hide(fragment_current)
                .show(fragment_next)
                .addToBackStack(null)// 加入返回栈,点击回退键会返回上一个fragment
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置转换动画
                .commitAllowingStateLoss();// 提交事务
    } else {
        // 如果fragment_next还没有添加,那么用add方法添加该碎片
        transaction
                .hide(fragment_current)// 隐藏fragment_current
                .add(R.id.frameLayout_workPlan, fragment_next)
                .addToBackStack(null)
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                .commitAllowingStateLoss();
    }
}

上面的代码简单来说就是fragmentA中顶部右侧的标题添加单击事件监听,用以跳转到fragmentB。方法中我加了关键的注释,大家应该能理解。

  • 虽说这是一个实现方法,但是难免嵌套多层fragment的时候会出现重影问题(有小概率会出现),我这里有几个比较好的链接给大家去参考参考,然后建议不要嵌套多层:

9行代码让你App内的Fragment对重叠说再见

Fragment全解析系列(二):正确的使用姿势


下面就来说说返回栈吧!

项目中我的activity都继承了一个基类:BaseActivity。
然后顶部的标题布局里的一些textview内容显示以及图标的单击事件监听都在基类中有实现,所以继承该基类可以调用对应的方法即可实现标题中内容的设置以及单击事件的实现。

那么我的一个问题就是在一个activity里面有多个fragment,那么我点击顶部左侧的返回图标时应该是退出当前fragment呢还是说直接销毁当前activity?

我的解决方案:

要解决这个问题,你需要跳转碎片的时候记得加入返回栈中 addToBackStack(null),那么返回栈中会记录你添加了多少个fragment,根据返回栈中的fragment数量来判断究竟是回退到上一个fragment还是说退出activity。我的BaseActivity中的左侧按钮事件代码如下:

   /**
     * 设置左测按钮事件
     *
     * @param id      图片ID
     * @param onClick 自定义单击事件
     */
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public void setTitleLeft(@NonNull int id, View.OnClickListener onClick) {
        TextView tv = (TextView) findViewById(R.id.title_tv_left);
        Drawable left = getResources().getDrawable(id);
        left.setBounds(0, 0, left.getMinimumWidth(), left.getMinimumHeight());
        tv.setCompoundDrawables(left, null, null, null);
        if (onClick != null) {
            tv.setOnClickListener(onClick);
        } else {
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
//                    finish();
                    // 如果返回栈中的fragment数量不为0那么点击返回当前fragment将会回退
                    if (manager.getBackStackEntryCount() != 0) {
                        manager.popBackStack();
                    } else {
                        // 如果返回栈中的fragmnet数量为0,那么直接退出当前activity
                        finish();
                    }
                }
            });
        }
    }

其中onClick里的代码就是解决方法:判断返回栈中fragment的数量是否为0,为0就直接退出当前activity,不为0就回退到上一个fragment。

其中manager是FragmentManager对象,
manager = getSupportFragmentManager(); 即可获取该对象。

类似解决方案:

Fragment返回栈与Activity任务栈的结合使用

发表评论