- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的代码中使用 BottomNavigationView
来显示 5 个图标。当我单击该图标时,会打开一个新 fragment 。
BottomNavigationView
实现有 2 个问题
底部导航 View
。我怎样才能让它看起来很白。我也有将文件中的 iconTint
设置为白色,但它仍然出现灰色/黑色。 Edit: 2nd question will be resolved by this question.
布局文件中的BottomNavigationView代码:
<android.support.design.widget.BottomNavigationView
android:id="@+id/main_screen_botton_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:background="@color/colorPrimaryDark"
app:itemTextColor="@color/cardview_light_background"
app:layout_behavior=".Common.BottomNavigationBehavior"
app:menu="@menu/mainscreen_bottomnav" />
菜单文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/main_screen_home"
android:icon="@drawable/home"
android:iconTint="@color/cardview_light_background"
android:title="Home"
app:showAsAction="ifRoom" />
<item
android:id="@+id/main_screen_xx"
android:icon="@drawable/xx"
android:iconTint="@color/cardview_light_background"
android:title="xx"
app:showAsAction="ifRoom" />
<item
android:id="@+id/main_screen_weather"
android:icon="@drawable/cloudy"
android:iconTint="@color/cardview_light_background"
android:title="Weather"
app:showAsAction="ifRoom" />
<item
android:id="@+id/main_screen_banking"
android:icon="@drawable/yy"
android:iconTint="@color/cardview_light_background"
android:title="Finance"
app:showAsAction="ifRoom" />
<item
android:id="@+id/main_screen_settings"
android:icon="@drawable/settings"
android:iconTint="@color/cardview_light_background"
android:title="Settings"
app:showAsAction="ifRoom" />
</menu>
在主要 Activity 中:
BottomNavigationView bottomNavigationView = findViewById(R.id.main_screen_botton_nav);
bottomNavigationView.setOnNavigationItemSelectedListener(this);
.
最佳答案
你需要试试这个。它在我的应用程序中完美运行。
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);
item.setShiftingMode(false);
item.setChecked(item.getItemData().isChecked());
}
} catch (NoSuchFieldException e) {
Log.e("BNVHelper", e.getMessage());
} catch (IllegalAccessException e) {
Log.e("BNVHelper", e.getMessage());
}
}
}
你可以像这样使用这个类:
BottomNavigationView bottomNavigation = (BottomNavigationView) findViewById(R.id.bottom_navigation);
BottomNavigationViewHelper.disableShiftMode(bottomNavigation);
底部导航 View :
<android.support.design.widget.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom|end"
app:itemBackground="@color/bottom_bar_unselect"
app:layout_behavior="com.cmexpertise.beautyapp.view.BottomNavigationBehavior"
app:itemIconTint="@drawable/navigation_background_text"
app:itemTextColor="@drawable/navigation_background_text"
app:menu="@menu/my_navigation_items" />
底部导航行为.Java :
import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.support.v4.view.ViewCompat;
import android.support.v4.view.ViewPropertyAnimatorCompat;
import android.support.v4.view.animation.LinearOutSlowInInterpolator;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
/**
*/
public final class BottomNavigationBehavior<V extends View> extends VerticalScrollingBehavior<V> {
private static final Interpolator INTERPOLATOR = new LinearOutSlowInInterpolator();
private final BottomNavigationWithSnackbar mWithSnackBarImpl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? new LollipopBottomNavWithSnackBarImpl() : new PreLollipopBottomNavWithSnackBarImpl();
private int mTabLayoutId;
private boolean hidden = false;
private ViewPropertyAnimatorCompat mOffsetValueAnimator;
private ViewGroup mTabLayout;
private int mSnackbarHeight = -1;
private boolean scrollingEnabled = true;
private boolean hideAlongSnackbar = false;
int[] attrsArray = new int[]{
android.R.attr.id, android.R.attr.elevation};
private int mElevation = 8;
public BottomNavigationBehavior() {
super();
}
public BottomNavigationBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
attrsArray);
mTabLayoutId = a.getResourceId(0, View.NO_ID);
mElevation = a.getResourceId(1, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mElevation, context.getResources().getDisplayMetrics()));
a.recycle();
}
public static <V extends View> BottomNavigationBehavior<V> from(@NonNull V view) {
ViewGroup.LayoutParams params = view.getLayoutParams();
if (!(params instanceof CoordinatorLayout.LayoutParams)) {
throw new IllegalArgumentException("The view is not a child of CoordinatorLayout");
}
CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) params)
.getBehavior();
if (!(behavior instanceof BottomNavigationBehavior)) {
throw new IllegalArgumentException(
"The view is not associated with BottomNavigationBehavior");
}
return (BottomNavigationBehavior<V>) behavior;
}
@Override
public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) {
mWithSnackBarImpl.updateSnackbar(parent, dependency, child);
return dependency instanceof Snackbar.SnackbarLayout;
}
@Override
public void onDependentViewRemoved(CoordinatorLayout parent, V child, View dependency) {
updateScrollingForSnackbar(dependency, child, true);
super.onDependentViewRemoved(parent, child, dependency);
}
private void updateScrollingForSnackbar(View dependency, V child, boolean enabled) {
if (dependency instanceof Snackbar.SnackbarLayout) {
scrollingEnabled = enabled;
if (!hideAlongSnackbar && ViewCompat.getTranslationY(child) != 0) {
ViewCompat.setTranslationY(child, 0);
hidden = false;
hideAlongSnackbar = true;
} else if (hideAlongSnackbar) {
hidden = true;
animateOffset(child, -child.getHeight());
}
}
}
@Override
public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) {
updateScrollingForSnackbar(dependency, child, false);
return super.onDependentViewChanged(parent, child, dependency);
}
@Override
public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) {
boolean layoutChild = super.onLayoutChild(parent, child, layoutDirection);
if (mTabLayout == null && mTabLayoutId != View.NO_ID) {
mTabLayout = findTabLayout(child);
elevateNavigationView();
}
return layoutChild;
}
@Nullable
private ViewGroup findTabLayout(@NonNull View child) {
if (mTabLayoutId == 0) return null;
return (ViewGroup) child.findViewById(mTabLayoutId);
}
@Override
public void onNestedVerticalOverScroll(CoordinatorLayout coordinatorLayout, V child, @ScrollDirection int direction, int currentOverScroll, int totalOverScroll) {
}
@Override
public void onDirectionNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed, @ScrollDirection int scrollDirection) {
handleDirection(child, scrollDirection);
}
private void handleDirection(V child, @ScrollDirection int scrollDirection) {
if (!scrollingEnabled) return;
if (scrollDirection == ScrollDirection.SCROLL_DIRECTION_DOWN && hidden) {
hidden = false;
animateOffset(child, 0);
} else if (scrollDirection == ScrollDirection.SCROLL_DIRECTION_UP && !hidden) {
hidden = true;
animateOffset(child, child.getHeight());
}
}
@Override
protected boolean onNestedDirectionFling(CoordinatorLayout coordinatorLayout, V child, View target, float velocityX, float velocityY, @ScrollDirection int scrollDirection) {
handleDirection(child, scrollDirection);
return true;
}
private void animateOffset(final V child, final int offset) {
ensureOrCancelAnimator(child);
mOffsetValueAnimator.translationY(offset).start();
}
private void ensureOrCancelAnimator(@NonNull V child) {
if (mOffsetValueAnimator == null) {
mOffsetValueAnimator = ViewCompat.animate(child);
mOffsetValueAnimator.setDuration(100);
mOffsetValueAnimator.setInterpolator(INTERPOLATOR);
} else {
mOffsetValueAnimator.cancel();
}
}
private void elevateNavigationView() {
if (mTabLayout != null) {
ViewCompat.setElevation(mTabLayout, mElevation);
}
}
public boolean isScrollingEnabled() {
return scrollingEnabled;
}
public void setScrollingEnabled(boolean scrollingEnabled) {
this.scrollingEnabled = scrollingEnabled;
}
public void setHidden(V view, boolean bottomLayoutHidden) {
if (!bottomLayoutHidden && hidden) {
animateOffset(view, 0);
} else if (bottomLayoutHidden && !hidden) {
animateOffset(view, -view.getHeight());
}
hidden = bottomLayoutHidden;
}
private interface BottomNavigationWithSnackbar {
void updateSnackbar(CoordinatorLayout parent, View dependency, View child);
}
private class PreLollipopBottomNavWithSnackBarImpl implements BottomNavigationWithSnackbar {
@Override
public void updateSnackbar(CoordinatorLayout parent, View dependency, View child) {
if (dependency instanceof Snackbar.SnackbarLayout) {
if (mSnackbarHeight == -1) {
mSnackbarHeight = dependency.getHeight();
}
int targetPadding = child.getMeasuredHeight();
int shadow = (int) ViewCompat.getElevation(child);
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) dependency.getLayoutParams();
layoutParams.bottomMargin = targetPadding - shadow;
child.bringToFront();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
child.getParent().requestLayout();
((View) child.getParent()).invalidate();
}
}
}
}
private class LollipopBottomNavWithSnackBarImpl implements BottomNavigationWithSnackbar {
@Override
public void updateSnackbar(CoordinatorLayout parent, View dependency, View child) {
if (dependency instanceof Snackbar.SnackbarLayout) {
if (mSnackbarHeight == -1) {
mSnackbarHeight = dependency.getHeight();
}
int targetPadding = (mSnackbarHeight +
child.getMeasuredHeight());
dependency.setPadding(dependency.getPaddingLeft(),
dependency.getPaddingTop(), dependency.getPaddingRight(), targetPadding
);
}
}
}
}
导航背景文本.xml :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimary" android:state_checked="true" />
<item android:color="@color/white" />
</selector>
关于android - BottomNavigationView 点击后占用空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50607629/
我一整天都在努力完成这项工作,但是 但没有成功。我尝试设置按钮顶部约束(垂直间距)相对于tableView。但是当我从我的快速代码中隐藏表格 View 时仍然占用空间。 我想要实现的是,当我隐藏表格
我一整天都在努力完成这项工作,但是 但没有成功。我尝试设置按钮顶部约束(垂直间距)相对于tableView。但是当我从我的快速代码中隐藏表格 View 时仍然占用空间。 我想要实现的是,当我隐藏表格
我不太擅长编程,但我做了一些研究,发现了这一小串 javascript,可以让我们在点击每个 javascript 链接按钮时立即在页面上播放声音: 问题是,当我放入其中几行来定义不同的声音时,它们
我该怎么做,让 .tabs__item2 占据右边的剩余空间? 我希望无论屏幕大小如何,.tabs__item2 都会填充剩余空间,一直到它的大蓝色 div 的边缘。可能类似于 width:100
我试图找到一种现代解决方案,在页面顶部有一个固定的菜单栏( flexbox ),在下面有一个 flexbox 。我希望页面滚动时菜单保持静态,第二个内容 flexbox 的内容滚动 (fixBox)。
我正在用 ajax 进度条和其他东西做一些事情...... 基本上我有一个隐藏的 div,里面写着“正在加载”,在它下面有一个可见的 div,里面有我的内容。 加载时,它淡出内容 div,使隐藏的 d
我有五个 div,每个都共享一个 ad_tile 类。该类在 div 的左侧和右侧提供 3 像素的填充和 1 像素的边框,并为内容提供清晰的修复。如果这些 div 中的一个或多个为空,则这些 div
有这个固定的 header元素( block 元素),带有 absolute定位nav带有菜单的元素,和另一个固定元素作为标志: About Contac
我有一个 ViewHolder,标题位于顶部,该标题在特定情况下变得可见。在大多数其他情况下, header 设置为 GONE。问题是,当 header 设置为 GONE 时,它的高度仍会计算,而其他
请注意,我的问题不是关于如何用 . 填充剩余空间 背景:我正在尝试将 jQuery sortable 与一系列水平布局的 , 结合使用与类 "column" .column { display:i
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improv
我有一个带有模板切换器的 ListView ,并且我希望在特定项目上隐藏它,所以我使用了一个隐藏模板。我将 View (或 StackLayout)设置为 isVisible=false 和 Heig
TL;DR:部署面向 ECS 的 CodePipeline 后,如何更改内存和 CPU 要求(或指定 ECS 任务定义的任何细节)? 我已经创建了一个部署 ECS 容器的 CodePipeline。为
哪种工具最适合测量 HDFS 空间消耗? 当我总结“hdfs dfs -du/”的输出时,与“hdfs dfsadmin -report”(“DFS Used”行)相比,我总是消耗更少的空间。是否有
我试图理解使用 MD5 哈希作为 Cassandra key 在“内存/存储消耗”方面的含义: 我的内容(在 Java 中)的 MD5 哈希 = byte[] 长 16 个字节。 (16 字节来自维基
我是一名优秀的程序员,十分优秀!