导航片段更改时消失的工厂图标
Disappearing fab icon on navigation fragment change
我有一个底部导航视图,其中包含 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个recycler视图,我们也隐藏了recyclerview滚动时的fab。
从底部导航遍历片段时,fab 可绘制对象将被正确设置,但在我们滚动的任何片段中,它会将此状态保存到 return 之后。
这会在转到另一个片段时删除 fab 可绘制对象,并使 fab 留空,没有可绘制图标。
我们如何解决这个问题?
这是 FloatingActionButton 中的一个错误 class:调用 show() 时,imageMatrixScale 设置为 0。然后调用 setImageResource() 只会显示空白。它在调用 show() 之前工作。
该错误已在设计库 28.0.0 中引入,它适用于 v27.1.1。降级到 27.1.1
在我的案例中,出于多种原因无法降级设计库。 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);
}
}
这对我有用。希望它能帮助其他面临同样问题的人。
我遇到了同样的问题,当 activity 进入 onPause 然后 onResume 我在 FloatingActionButton
上调用 setImageResource
。 FAB 图标正在消失。我的解决方案是在 setImageResource
之后立即调用以下内容
mFloatingActionButton.hide();
mFloatingActionButton.show();
此问题似乎已在 Material Components 1.1.0 中修复,但目前处于 alpha 阶段。
尝试过:
implementation com.google.android.material:material:1.1.0-alpha10
我有一个底部导航视图,其中包含 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个recycler视图,我们也隐藏了recyclerview滚动时的fab。
从底部导航遍历片段时,fab 可绘制对象将被正确设置,但在我们滚动的任何片段中,它会将此状态保存到 return 之后。
这会在转到另一个片段时删除 fab 可绘制对象,并使 fab 留空,没有可绘制图标。 我们如何解决这个问题?
这是 FloatingActionButton 中的一个错误 class:调用 show() 时,imageMatrixScale 设置为 0。然后调用 setImageResource() 只会显示空白。它在调用 show() 之前工作。
该错误已在设计库 28.0.0 中引入,它适用于 v27.1.1。降级到 27.1.1
在我的案例中,出于多种原因无法降级设计库。 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);
}
}
这对我有用。希望它能帮助其他面临同样问题的人。
我遇到了同样的问题,当 activity 进入 onPause 然后 onResume 我在 FloatingActionButton
上调用 setImageResource
。 FAB 图标正在消失。我的解决方案是在 setImageResource
mFloatingActionButton.hide();
mFloatingActionButton.show();
此问题似乎已在 Material Components 1.1.0 中修复,但目前处于 alpha 阶段。
尝试过:
implementation com.google.android.material:material:1.1.0-alpha10