如何在安卓中去除底部导航栏的图标动画

41

我在我的项目中使用了Design Support Library 25中的Bottom Navigation View。视图中有5个图标。每当选择一个图标时,它都会有一些动画效果。但是当只有3个或更少的图标时,它们不显示任何动画效果。我想要移除那些动画效果,只需要改变图标的颜色。我该怎么做呢?我已经搜索过了,但是找不到解决方法。请帮忙,谢谢。


2
可能是如何禁用BottomNavigationView shift mode?的重复。 - Przemysław Piechota. kibao
要禁用比例动画,请按照此答案操作:https://dev59.com/sVYN5IYBdhLWcg3wZnXG#52322460 - nuamehas
14个回答

92

从这个线程中得到了答案。

去除动画或位移模式。

BottomNavigationView的实现有一个条件:当有超过3个项目时使用位移模式。

创建辅助类

import android.support.design.internal.BottomNavigationItemView; 
import android.support.design.internal.BottomNavigationMenuView; 
import android.support.design.widget.BottomNavigationView; 
import android.util.Log;
import java.lang.reflect.Field;

public class BottomNavigationViewHelper { 
    public static void disableShiftMode(BottomNavigationView view) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) view.getChildAt(0);
        try { 
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView item = (BottomNavigationItemView) menuView.getChildAt(i);
                //noinspection RestrictedApi 
                item.setShiftingMode(false);
                // set once again checked value, so view will be updated 
                //noinspection RestrictedApi 
                item.setChecked(item.getItemData().isChecked());
            } 
        } catch (NoSuchFieldException e) {
            Log.e("BNVHelper", "Unable to get shift mode field", e);
        } catch (IllegalAccessException e) {
            Log.e("BNVHelper", "Unable to change value of shift mode", e);
        } 
    } 
} 

使用方法

BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_bar);
BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

1
你好,感谢您的提问和回答。这个程序已经完美运行了,但我仍然在为图标的颜色而苦恼。我的默认图标是黑色的,但它显示为浅黑色。当我点击图标时,它的颜色变成了白色。如何解决这个问题? - Rucha Bhatt Joshi
我不知道为什么这在我的应用程序中不起作用 :( 我已经苦苦挣扎了几个小时了。 - pamobo0609
7
我收到以下错误信息:BottomNavigationItemView.setShiftingMode 只能从同一库组(groupId=com.android.support)内调用。 - Suresh Parmar
3
@SureshParmar,看起来最新版本的设计库不起作用了。你知道他们是否将禁用换挡模式移动到公共API中吗? - midhunhk
1
对于那些找到这个问题的人,这是关于将此作为BottomNavigationView功能添加到Android支持库问题跟踪器中的问题:https://issuetracker.google.com/issues/37125827 - Brandon Haugen
显示剩余4条评论

21

我尝试过这个方法,效果很好

BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);

或者这段代码mainactivity.xml

app:labelVisibilityMode="unlabeled"

3
在MainActivity.xml中,这行代码的翻译是:app:labelVisibilityMode="labeled",它的意思是将标签显示模式设置为“标记”。 - Azad Qaderzadeh
它对我起作用了,但是我有一个问题。我有标题,但在实施这个代码后,我只能看到图标(我已经将标题改为图标)。 - Vasant Raval

8
标签文本大小的更改导致动画效果。如果将一般、活动和非活动文本的外观设置为相同,则不会发生更改,因此也没有动画。
例如:
<android.support.design.widget.BottomNavigationView
    android:id="@+id/navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"

    app:itemTextAppearance="@style/TextAppearance.AppCompat.Caption"
    app:itemTextAppearanceActive="@style/TextAppearance.AppCompat.Caption"
    app:itemTextAppearanceInactive="@style/TextAppearance.AppCompat.Caption"

    app:menu="@menu/navigation"/>

在这里,我已经设置了预先构建的样式(@style/TextAppearance.AppCompat.Caption),但如果你想要设置自己的文本样式,只需记住将它们全部设置为相同即可。


8

我只是在dimens.xml文件中添加了这段代码,它就像魔法一样起作用了!

<dimen name="design_bottom_navigation_active_text_size" tools:override="true">@dimen/design_bottom_navigation_text_size</dimen>

到目前为止,这是最好的解决方案。谢谢。 - Saeed Younus
最佳答案,我已经检查了多个。 - DIRTY DAVE

7

BottomNavigationViewEx是标准BottomNavigationView的一个很好的扩展。 enableShiftingMode(false)可以为您完成此任务。


7
尝试使用以下布局:

app:labelVisibilityMode="labeled"

或者在代码级别使用以下代码: mNavigationView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); 并将您的设计支持库更新至28.0.+。

4

当我使用当前版本时

implementation 'com.google.android.material:material:1.1.0-alpha06'

我将"labelVisibilityMode"设置为"labeled"。

app:labelVisibilityMode="labeled"

在这种情况下,我通过了。
<dimen name="design_bottom_navigation_active_text_size" tools:override="true">@dimen/design_bottom_navigation_text_size</dimen>

我也希望能够帮助您。

3
这可能不是最优雅或最实用的解决方案,但您可以尝试将以下行添加到您的BottomNavigationView中。
app:labelVisibilityMode="unlabeled"

它将删除标签并禁用动画。

为了使用此功能,您需要使用com.android.support:design:28.0.0-alpha1。 - saltandpepper
3
但我希望标签没有动画。 - Prince Dholakiya
2
@user7832102 要禁用比例动画,请按照此答案操作:https://dev59.com/sVYN5IYBdhLWcg3wZnXG#52322460 - nuamehas

2
我尝试了所有这些答案,但都无法移除当图标被点击时产生的涟漪动画。
我找到的解决方案是使用BottomNavigationViewEx类(在此处设置- https://github.com/ittianyu/BottomNavigationViewEx)。
然后在程序中设置:
bottomNavigationView.setItemRippleColor(ColorStateList.valueOf(Color.parseColor("#FFFFFF")));

2

只需要这样做......在值存储库内创建dimen文件,然后在其中添加。

<dimen name="design_bottom_navigation_active_text_size">10sp</dimen>
<dimen name="design_bottom_navigation_text_size">10sp</dimen>

10sp以上仅仅是一个示例。在BottomNavigationView中添加:

<com.google.android.material.bottomnavigation.BottomNavigationView
..
app:labelVisibilityMode="labeled"/>

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