导航片段更改后,Fab图标消失了

时间:2018-08-19 16:51:03

标签: android android-fragments bottomnavigationview floating-action-button

我有一个底部导航视图,其中包含3个项目,这些项目可导航到3个不同的片段(片段仅创建一次,其实例保存在mainactivity的onSavedInstanceState()中),其顶部是一个浮动操作按钮。

我们希望在访问每个片段时更改fab的图标可绘制性,我们在切换情况下在fab上尝试setImageResource().setImageDrawable()时都选择了每个底部导航图标。

/**
 * used to handle switching between fragments when a new navigation item is selected
 */
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    switch (item.getItemId()) {
        case R.id.nav_tasks:
            .........
    loadFragment(tasksFragment);
            mFab.setOnClickListener(mFabClickListenerTasks);
            mFab.setImageDrawable(getResources().getDrawable(R.drawable.ic_add_task));
    //2 tabs in 1 fragment
            if (mTabLayout.getSelectedTabPosition() == 1)
                mFab.hide();
            else mFab.show();
            break;
        case R.id.nav_employees:
            .......
            loadFragment(employeesFragment);
            mFab.setOnClickListener(mFabClickListenerEmployees);
            mFab.setImageDrawable(getResources().getDrawable(R.drawable.ic_add_employee2));
            mFab.show();


            break;
        case R.id.nav_departments:
            .......
            loadFragment(departmentsFragment);
            mFab.setOnClickListener(mFabClickListenerDepartments);
           mFab.setImageDrawable(getResources().getDrawable(R.drawable.ic_add_department));
            mFab.show();


            break;

    }

    item.setChecked(true);

    return true;
}
void loadFragment(Fragment fragment) {
    if (activeFragment == fragment)
        return;

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.hide(activeFragment).show(fragment);
    activeFragment = fragment;
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

    if (activeFragment instanceof TasksFragment)
        mFab.setImageResource(R.drawable.ic_add_task);
    else if(activeFragment instanceof DepartmentsFragment)
        mFab.setImageResource(R.drawable.ic_add_department);
    else if(activeFragment instanceof EmployeesFragment)
        mFab.setImageResource(R.drawable.ic_add_employee2);

    transaction.commit();
}

这3个片段主要是3个回收站视图,当回收站视图滚动时,我们也隐藏了晶圆厂。

从底部导航遍历片段时将正确设置fab drawable,但是在任何片段中,当我们滚动时,它都会保存此状态并随后返回到它。

这会在转到另一个片段时删除fab可绘制区域,并使fab空为空,没有图标可绘制区域。 我们该如何解决呢?

4 个答案:

答案 0 :(得分:11)

当活动进入onPause然后进入onResume时,我遇到了相同的问题,我在 @wraps(fn_to_wrap) def uni_wrapper(*args, **kwargs): if from_coroutine(): return async_wrapper(*args, **kwargs) time.sleep(.1) print('Did some sync stuff') return fn_to_wrap(*args, **kwargs) 上调用了setImageResource。 FAB图标消失。我的解决方案是在FloatingActionButton

之后立即拨打以下电话
setImageResource

答案 1 :(得分:5)

这是FloatingActionButton类中的一个错误:调用show()时,imageMatrixScale设置为0。对setImageResource()的调用仅显示为空白。它可以在调用show()之前起作用。

该错误已在设计库28.0.0中引入,正在v27.1.1上运行。降级到27.1.1

编辑:Google Issuetracker

答案 2 :(得分:2)

在我看来,由于许多原因,降级设计库是不可能的。斯塔菲尔格先生的回答帮助我找到了解决方案:

public class MyNewFab  extends FloatingActionButton {

    private Matrix imageMatrix;

    ...  

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        imageMatrix = getImageMatrix();
    }

    @Override
    public void setImageResource(int resId) {
        super.setImageResource(resId);
        setImageMatrix(imageMatrix);
    }
}

这对我有用。希望它能帮助其他面临相同问题的人。

答案 3 :(得分:0)

该问题似乎已在Material Components 1.1.0中修复,但当前在Alpha中。

尝试过:

implementation com.google.android.material:material:1.1.0-alpha10