【问题标题】:Disappearing fab icon on navigation fragment change导航片段更改上消失的工厂图标
【发布时间】:2019-01-25 22:35:19
【问题描述】:

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

我们想在访问每个片段时更改Fab的图标,我们在挑选每个底部导航图标时尝试了每个底部导航图标的setImageResource().setImageDrawable().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个fragment主要是3个recyclerview,我们也在recyclerview滚动的时候隐藏了fab。

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

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

【问题讨论】:

  • 你最后找到解决办法了吗?
  • @maxoumime 不,我没有。

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


【解决方案1】:

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

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

【讨论】:

  • 为我的目的工作。感谢您的建议
  • 你也可以把 setImageResources 放在 hide 和 show 之间。隐藏() > setImageResource() > 显示()
  • 你是我的英雄
【解决方案2】:

这是 FloatingActionButton 类中的一个错误:调用 show() 时,imageMatrixScale 设置为 0。调用 setImageResource() 然后只显示空白。它在调用 show() 之前工作。

该错误已在设计库 28.0.0 中引入,它适用于 v27.1.1。降级到 27.1.1

编辑:Google Issuetracker

【讨论】:

    【解决方案3】:

    在我的情况下,出于多种原因,降级设计库是不可能的。 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);
        }
    }
    

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

    【讨论】:

      【解决方案4】:

      该问题似乎已在 Material Components 1.1.0 中得到修复,但目前处于 alpha 阶段。

      试过了:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-13
        • 1970-01-01
        • 2019-07-03
        • 1970-01-01
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多