导航片段更改时,fab图标消失

13

我有一个底部导航视图,其中有3个项目,它们导航到3个不同的片段(片段仅创建一次,并将它们的实例保存在MainActivity的onSavedInstanceState()中),并在其上方有一个浮动操作按钮。

当访问每个片段时,我们想要更改fab的图标可绘制对象,我们尝试在switch case中选择每个底部导航图标时使用setImageResource().setImageDrawable()在fab上。

/**
 * 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个回收站视图,当recyclerview滚动时,我们也会隐藏fab。

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

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


你最终找到解决方法了吗? - maxoumime
@maxoumime 没有,我没有。 - Moamen Mohamed
4个回答

20

当活动进入 onPause 然后再进入 onResume 时,我会遇到同样的问题,我在 FloatingActionButton 上调用了 setImageResource,但 FAB 图标会消失。我的解决方案是在 setImageResource 后立即调用以下内容:

mFloatingActionButton.hide();        
mFloatingActionButton.show();

达到了我的目的。感谢您的建议。 - convexHull
1
你也可以在 hide() 和 show() 之间加入 setImageResource()。 - Angel Koh
你是我的英雄。 - Pitto

14

浮动操作按钮类中存在一个bug:当调用show()函数时,图片矩阵缩放设置为0。此后调用setImageResource()函数会显示空白。在调用show()之前是有效的。

这个bug是在design lib 28.0.0中引入的,而在v27.1.1上是正常工作的。建议降级到版本27.1.1。

编辑:Google Issuetracker


4

在我的情况下,由于种种原因,无法降级设计库。MrStahlfelge的答案帮助我找到了解决方案:

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);
    }
}

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


1
问题似乎已经在Material Components 1.1.0中得到修复,但目前仍处于alpha版本。
尝试使用: implementation com.google.android.material:material:1.1.0-alpha10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接