BottomNavigationView底部导航栏的一点东西

安卓BottomNavigationView页面切换 我们通过反射拿到了BottomNavigationMenuView,至于为什么是BottomNavigationView 的第一个子View这就要看源码了,AS中直接可以点进去看。Android端采用底部导航栏的APP非常多,比如微信、微博、支付宝...等等,这也不能说是盲目学习iOS,毕竟好东西大家都可以用,各家操作系统也都在博采众长,互相学习。没办法了,查了一圈资料,发现官方这个控件还不支持代码层级的切换选项(如果你发现了,请告诉我)。细心的朋友可能发现了,上面的代码为什么用了反射呢? 阅读详情

#Material Design使用

  1. ripple水波纹
  2. BottomNavigationView

##2. BottomNavigationView 底部导航控件

爸爸原文链接

中文参考

###1. 继承关系

java.lang.Object  
	↳	android.view.View  
   		↳	android.view.ViewGroup  
 	   		↳	android.widget.FrameLayout  
 	 	   		↳	android.support.design.widget.BottomNavigationView

###2. 基本用法

	//布局文件中
	<android.support.design.widget.BottomNavigationView
        android:id="@+id/bottomNavigationView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="5dp"
        app:itemIconTint="@color/yellow_menu_selector"
        app:itemTextColor="@color/yellow_menu_selector"
        app:menu="@menu/main_bottom_menu"/>
        
   //设置我们需要显示的menu
	<?xml version="1.0" encoding="utf-8"?>
	<menu xmlns:android="http://schemas.android.com/apk/res/android">
    	<item
        	android:orderInCategory="0"
        	android:title="首页"
        	android:icon="@drawable/icon_home_default" />
    	<item
        	android:orderInCategory="1"
        	android:title="消息"
        	android:icon="@drawable/icon_dynamic_default" />
    	<item
        	android:orderInCategory="2"
        	android:title="财富"
        	android:icon="@drawable/icon_treasure_default" />
	</menu>
	
	//activity中
	bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                viewPager.setCurrentItem(item.getOrder());
                return false;
            }
        });
    

###3. 先上两张效果图,第一次进行adb命令录屏,然后工具转GIF,稍后也记录一下。 ###4. 源码导读,一看究竟

Google推荐我们在有3-5个顶层视图时使用这个控件,但在实际使用过程中发现在底部MenuItem的个数大于3的时候显示的形式和我想要的还是有点区别的。
接下来我们就要去查看是什么造成了这种显示效果的区别。
BottomNavigationView类包含在这样这样一个成员变量

private final BottomNavigationMenuView mMenuView;
这是我们在xml中设置的menu,我猜出现不同显示效果的原因就是由它控制的,我们去看源码。哎!我看到了这个!
mShiftingMode = mMenu.size() > 3;
for (int i = 0; i < mMenu.size(); i++) {
        mPresenter.setUpdateSuspended(true);
        mMenu.getItem(i).setCheckable(true);
        mPresenter.setUpdateSuspended(false);
        BottomNavigationItemView child = getNewItem();
        mButtons[i] = child;
        child.setIconTintList(mItemIconTint);
        child.setTextColor(mItemTextColor);
        child.setItemBackground(mItemBackgroundRes);
        child.setShiftingMode(mShiftingMode);
        child.initialize((MenuItemImpl) mMenu.getItem(i), 0);
        child.setItemPosition(i);
        child.setOnClickListener(mOnClickListener);
        addView(child);
    }
	

这是个什么玩意儿呢,它是怎么造成显示异常的呢?继续看源码。看到这里

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        final int width = MeasureSpec.getSize(widthMeasureSpec);
        final int count = getChildCount();

        final int heightSpec = MeasureSpec.makeMeasureSpec(mItemHeight, MeasureSpec.EXACTLY);

        if (mShiftingMode) {
            final int inactiveCount = count - 1;
            final int activeMaxAvailable = width - inactiveCount * mInactiveItemMinWidth;
            final int activeWidth = Math.min(activeMaxAvailable, mActiveItemMaxWidth);
            final int inactiveMaxAvailable = (width - activeWidth) / inactiveCount;
            final int inactiveWidth = Math.min(inactiveMaxAvailable, mInactiveItemMaxWidth);
            int extra = width - activeWidth - inactiveWidth * inactiveCount;
            for (int i = 0; i < count; i++) {
                mTempChildWidths[i] = (i == mActiveButton) ? activeWidth : inactiveWidth;
                if (extra > 0) {
                    mTempChildWidths[i]++;
                    extra--;
                }
            }
        } else {
            final int maxAvailable = width / (count == 0 ? 1 : count);
            final int childWidth = Math.min(maxAvailable, mActiveItemMaxWidth);
            int extra = width - childWidth * count;
            for (int i = 0; i < count; i++) {
                mTempChildWidths[i] = childWidth;
                if (extra > 0) {
                    mTempChildWidths[i]++;
                    extra--;
                }
            }
        } 
    }   
从代码中可以看出,  
在mShiftingMode = true 时,经过一系列的算法之后确定不同状态下的MenuItem的尺寸,出于选中状态下的menu的宽度是比其他的menuItem 大很多的。由于除法是取整的,最后的循环就是为了将剩下的几个像素分散在前几个MenuItem上。  
在mShiftingMode =false 时,直接将宽度等分分配给了每一个MenuItem。那我们如果希望在menuItem数量为4甚至5的时候使用等分效果,直接设置mShiftingMode =false不就行了吗?!事实上也就是如此,但是该怎么做呢我们又不能修改源码,难道要重写?算了太麻烦了,还是开启上帝模式吧(反射)。可别高兴的太早,当你这么做了之后,发现虽然是等分了,可是为什么menuTitle没有显示呢?  
*答案在这里*
	public void buildMenuView() {
        if (mButtons != null) {
            for (BottomNavigationItemView item : mButtons) {
                sItemPool.release(item);
            }
        }
        removeAllViews();
        if (mMenu.size() == 0) {
            return;
        }
        mButtons = new BottomNavigationItemView[mMenu.size()];
        mShiftingMode = mMenu.size() > 3;
        for (int i = 0; i < mMenu.size(); i++) {
            mPresenter.setUpdateSuspended(true);
            mMenu.getItem(i).setCheckable(true);
            mPresenter.setUpdateSuspended(false);
            BottomNavigationItemView child = getNewItem();
            mButtons[i] = child;
            child.setIconTintList(mItemIconTint);
            child.setTextColor(mItemTextColor);
            child.setItemBackground(mItemBackgroundRes);
            //!!!!!看这里!!!!!!!
            child.setShiftingMode(mShiftingMode);
            child.initialize((MenuItemImpl) mMenu.getItem(i), 0);
            child.setItemPosition(i);
            child.setOnClickListener(mOnClickListener);
            addView(child);
        }
        mActiveButton = Math.min(mMenu.size() - 1, mActiveButton);
        mMenu.getItem(mActiveButton).setChecked(true);
    }
为什么设置了这个就可以了呢?继续看MenuItem的源码。
	public void setChecked(boolean checked) {
        mItemData.setChecked(checked);

        ViewCompat.setPivotX(mLargeLabel, mLargeLabel.getWidth() / 2);
        ViewCompat.setPivotY(mLargeLabel, mLargeLabel.getBaseline());
        ViewCompat.setPivotX(mSmallLabel, mSmallLabel.getWidth() / 2);
        ViewCompat.setPivotY(mSmallLabel, mSmallLabel.getBaseline());
        if (mShiftingMode) {
            if (checked) {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
                iconParams.topMargin = mDefaultMargin;
                mIcon.setLayoutParams(iconParams);
                //!!!这里!!!
                mLargeLabel.setVisibility(VISIBLE);
                ViewCompat.setScaleX(mLargeLabel, 1f);
                ViewCompat.setScaleY(mLargeLabel, 1f);
            } else {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER;
                iconParams.topMargin = mDefaultMargin;
                mIcon.setLayoutParams(iconParams);
                //!!!这里!!!
                mLargeLabel.setVisibility(INVISIBLE);
                ViewCompat.setScaleX(mLargeLabel, 0.5f);
                ViewCompat.setScaleY(mLargeLabel, 0.5f);
            }
            //mShiftingMode模式下 小字体会被隐藏
            mSmallLabel.setVisibility(INVISIBLE);
        } else {
            if (checked) {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
                iconParams.topMargin = mDefaultMargin + mShiftAmount;
                mIcon.setLayoutParams(iconParams);
                //!!!这里!!!
                mLargeLabel.setVisibility(VISIBLE);                					mSmallLabel.setVisibility(INVISIBLE);
                ViewCompat.setScaleX(mLargeLabel, 1f);
                ViewCompat.setScaleY(mLargeLabel, 1f);
                ViewCompat.setScaleX(mSmallLabel, mScaleUpFactor);
                ViewCompat.setScaleY(mSmallLabel, mScaleUpFactor);
            } else {
                LayoutParams iconParams = (LayoutParams) mIcon.getLayoutParams();
                iconParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
                iconParams.topMargin = mDefaultMargin;
                mIcon.setLayoutParams(iconParams);
                //!!!这里!!!
                mLargeLabel.setVisibility(INVISIBLE);
                mSmallLabel.setVisibility(VISIBLE);

                ViewCompat.setScaleX(mLargeLabel, mScaleDownFactor);
                ViewCompat.setScaleY(mLargeLabel, mScaleDownFactor);
                ViewCompat.setScaleX(mSmallLabel, 1f);
                ViewCompat.setScaleY(mSmallLabel, 1f);
            }
        }

        refreshDrawableState();
    }
什么 代码太多懒得看,来,我来带你看。很简单啊,根据mShiftingMode的值做了不同处理啊。对什么进行了区别处理?我猜就是文字的显示和隐藏。看15,24和36,47有什么不一样,相信你一定已经看出来了。相信想探底的你肯定还不满足,再来看一段代码。  
	<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <ImageView
        android:id="@+id/icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="@dimen/design_bottom_navigation_margin"
        android:layout_marginBottom="@dimen/design_bottom_navigation_margin"
        android:duplicateParentState="true" />
    <android.support.design.internal.BaselineLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/design_bottom_navigation_margin"
        android:layout_gravity="bottom|center_horizontal"
        android:duplicateParentState="true">
        <TextView
            android:id="@+id/smallLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="@dimen/design_bottom_navigation_text_size"
            android:duplicateParentState="true" />
        <TextView
            android:id="@+id/largeLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="invisible"
            android:textSize="@dimen/design_bottom_navigation_active_text_size"
            android:duplicateParentState="true" />
    </android.support.design.internal.BaselineLayout>
</merge>
看到smallLabel和largeLabel了吗,mShiftingMode模式下 小字体会被隐藏,选中时显示字体,未选中不显示字体(暂时没有考虑动效)。ok,事已至此,针对性的解决问题就好了。来看代码
	public class BottomNavigationViewHelper {

        public void disableShiftMode(BottomNavigationView navigationView) {
            BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
            try {
                //修改BottomNavigationMenuView中mShiftingMode变量的值
                //达到均分宽度的效果
                Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
                shiftingMode.setAccessible(true);
                shiftingMode.setBoolean(menuView, false);
                shiftingMode.setAccessible(false);

                //修改BottomNavigationItemView中mShiftingMode变量的值
                //达到正常显示文字的效果
                for (int i = 0; i < menuView.getChildCount(); i++) {
                    BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
                    itemView.setShiftingMode(false);
                    itemView.setChecked(itemView.getItemData().isChecked());
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

###5. 实战演练

  • MenuItem = 3 参考基础用法

  • MenuItem = 4

//XML
<android.support.design.widget.BottomNavigationView
	android:id="@+id/bottomNavigationView"
	android:layout_width="match_parent"
	android:layout_height="50dp"
	android:layout_alignParentBottom="true"
	android:layout_marginTop="5dp"
	app:itemIconTint="@color/yellow_menu_selector"
	app:itemTextColor="@color/yellow_menu_selector"
	app:menu="@menu/main_bottom_menu"/>
	
//MenuItem
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:orderInCategory="0"
        android:title="首页"
        android:icon="@drawable/icon_home_default" />
    <item
        android:orderInCategory="1"
        android:title="消息"
        android:icon="@drawable/icon_dynamic_default" />
    <item
        android:orderInCategory="2"
        android:title="财富"
        android:icon="@drawable/icon_treasure_default" />
    <item
        android:orderInCategory="3"
        android:title="我的"
        android:icon="@drawable/icon_my_default" />
</menu>

private void initNavigationView() {
    BottomNavigationViewHelper.disableShiftMode(bottomNavigationView);
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                viewPager.setCurrentItem(item.getOrder());
                return false;
            }
        });   
}

public class BottomNavigationViewHelper {
    public void disableShiftMode(BottomNavigationView navigationView) {
        BottomNavigationMenuView menuView = (BottomNavigationMenuView) navigationView.getChildAt(0);
        try {
            //修改BottomNavigationMenuView中mShiftingMode变量的值
            //达到均分宽度的效果
            Field shiftingMode = menuView.getClass().getDeclaredField("mShiftingMode");
            shiftingMode.setAccessible(true);
            shiftingMode.setBoolean(menuView, false);
            shiftingMode.setAccessible(false);

            //修改BottomNavigationItemView中mShiftingMode变量的值
            //达到正常显示文字的效果
            for (int i = 0; i < menuView.getChildCount(); i++) {
                BottomNavigationItemView itemView = (BottomNavigationItemView) menuView.getChildAt(i);
                itemView.setShiftingMode(false);
                itemView.setChecked(itemView.getItemData().isChecked());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

###6.0 The End

22

Android ------ Android X 的BottomNavigationView底部导航栏 底部导航栏的使用比较常见,目前常用的APP几乎都是使用底部导航栏将内容分类, 这个Android 的底部导航栏 BottomNavigationView由Google官方推荐的, 先来看看案例效果图 打入依赖: implementation "com.google.android.material:material:1.0.0" 布局: <com.google.android.material.bottomnavigation.BottomNavigationView 阅读详情

相关推荐

Android界面设计深度优化:底部导航栏与沉浸式状态栏实现指南

是Android Support Library中提供的一款用于在底部导航栏中展示菜单项的组件。它允许用户通过点击不同的菜单项快速地在应用的不同功能模块间切换。此组件支持最多五个主菜单项,每个菜单项可以包含图标和文字标签,并支持图标选择器、文字颜色变化等视觉效果。组件的核心特性包括:动态更新:允许动态地向底部导航栏添加或移除菜单项。状态保存与恢复:在屏幕旋转或应用从后台恢复时,保持用户当前选中的菜单项状态。多选性。

weixin_35982453的博客 1453

BottomNavigationView的通用修改记录(新解决方案)

BottomNavigationView是design包下的一款底部导航控件,初次使用发现效果特别不错,可是到了实际开发中,我们要的效果就不能按照谷歌的标准来开发了。都会有美工给我们切好图,而我们把图片放入后,却被bottomNavigationView修改成了他默认的颜色切换,而有时候我们的图片就不是纯色的图。自动模式,该模式使用item数来确定是否显示或隐藏标签,即自动开启shifting mode,默认的模式。这里注意margin的使用,不是越大,文字图片的间距就越大,还是拿修改参数看图说话。

一个IT人的技术成长历程。 1330

Android 使用BottomNavigationView实现底部导航栏

Android 使用BottomNavigationView实现底部导航栏,在Android Support Library 25 中增加了 BottomNavigationView 控件,官方为我们提供了这样这一个控件。

BottomNavigationView 切换刷新当前页面解决方案

环境 Android Studio 4.2.1 编译版本 30 问题描述 使用 FragmentContainerView 和 BottomNavigationView 作为Tab 切换架构,点击 tab 时,当前Fragment页面也会重新刷新,导致页面会出现闪烁,而且需要特别处理刷新。 问题分析 通过 Android Studio 模板新建的项目,运行发现问题同样存在。查找网络,也发现有反映同样问题,并给出了处理。 通过谷歌提供的示例 NavigationAdvancedSample 则没有出现同样情

董攀的博客 2672

安卓动态设置BottomNavigationView底部导航

前言:解决项目中有多个端的情况 效果图: 1:app\build.gradle中添加依赖: android x : implementation 'androidx.appcompat:appcompat:1.1.0' 非android x(注意版本号对应) : implementation 'com.android.support:design:28.0.0' 2:MainActivity: public class MainActivity extends AppCompatActivity implements BottomNavigationView.OnNavigation

随机森林文本分类

随机森林原理及代码实现 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录随机森林原理及代码实现前言一、集成算法是什么?二、随机森林是什么三、 数据预处理3.1 先来看一下我们的文本数据3.2 预处理3.3 统计评论情感值积极与消极的占比二、使用步骤参数介绍(4个)属性1.引入库2.参数调参方法总结 前言 提示:这里可以添加本文要记录的大概内容: 例如

m0_46579176的博客 5808

3分钟教你实现仿微信底部导航栏效果(BottomNavigationView + ViewPager)

在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。

2401_84544531的博客 896

安检机图像处理避坑指南:从条纹校正到物质分类,那些论文里没写的工程细节

本文深入探讨了双能X射线安检机图像处理中的关键工程实践,从条纹校正到物质分类,揭示了论文中未提及的实用技巧。针对探测器校正、物质分类模糊、伪彩色系统设计等核心问题,提供了动态参数更新、空间上下文分析和自适应色彩映射等解决方案,助力提升安检系统的准确性和鲁棒性。

weixin_30325487的博客 888

Android关于BottomNavigationView使用指南

BottomNavigationView

QG 5820

深入解析FDTD Script中的farfieldpolar3d命令:复电场计算与应用

本文深入解析了FDTD仿真中`farfieldpolar3d`命令的核心功能与应用。作为`farfield3d`的复数版本,该命令能计算并返回球坐标系下的复电场矢量,完整保留振幅与相位信息,为光学天线设计、近远场变换及偏振态分析等高级应用提供了关键数据基础。

grafana6viz的博客 286

华为交换机密码策略配置避坑指南:明文/密文、长度、复杂度,一个命令就出错

本文详细解析华为交换机密码策略配置的关键要点,包括密码长度、复杂度及等保合规要求。通过实战案例揭示常见配置误区,如明文/密文密码格式差异、复杂度检查联动机制等,帮助网络工程师避免安全漏洞。特别针对等保二级和三级要求,提供可直接落地的安全加固方案。

weixin_30879169的博客 368

Android 使用 ToolBar 实现顶部标题栏、搜索栏 并使用 BottomNavigationView 实现底部导航栏的效果

顶部标题栏与底部导航栏的使用:MainActivity_toolbar.java(Activity)layout_toolbar.xmlnav_menu.xml(Menu Resource File)menu_main.xml(Menu Resource File)MyFragment1.java (java文件)MyFragment2.java (java文件)MyFragment3.java (java文件)MyFragment4.java (java文件)layout_fragment1.xmllay

hey,欢迎浏览我的博客,希望能给你提供帮助。 3158

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2003

底部导航BottomNavigationView+ViewPager 底部图标不放大解决办法

Android流行UI布局:底部导航(BottomNavigationView+ViewPager+ 2016-12-12 16:43 出处:未知 人气:3936 评论(0) 前言: Android端采用底部导航栏的APP非常多,比如微信、微博、支付宝...等等,这也不能说是盲目学习iOS,毕竟好东西大家都可以用,各家操作系统也都在博采众长,互相学习。Androi

zhangyitian5的博客 4338

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

皮肤病识别 - 使用DenseNet或EfficientNet模型在ISIC数据集上进行皮肤病识别任务

在本篇博客中,我们探讨了如何使用 DenseNet 和 EfficientNet 模型在 ISIC 数据集上进行皮肤病识别任务。我们加载了数据集,并进行了预处理。然后我们使用 Keras 构建了两个不同的模型,并训练和评估了它们。最后,我们使用训练好的模型对新的皮肤病图像进行了预测。

斌擎科技 1306

Fragment和BottomNavigationview实现导航布局

思路分析 实现导航栏有很多思路,一种比较简单的方法是使用 Fragment 和 BottomNavigationView 实现 Activity 作为 Fragment 的宿主 BottomNavigationview 作为底部 tab 用来切换 Framelayout 作为 Fragment 的容器 FragmentManager (FragmentTrans...

测试 1208

Python爬虫实战:基于Scrapy与Playwright高效爬取人民网新闻数据

本文将详细介绍如何使用Python最新技术栈(Scrapy框架结合Playwright浏览器自动化工具)高效爬取人民网新闻数据。文章包含完整项目搭建、反反爬策略、数据解析存储以及性能优化等核心内容,提供可直接运行的代码示例,适合中高级Python开发者学习现代网络爬虫开发技术。python# 去除特殊空白字符。

2201_76125261的博客 1118

Android实现底部导航栏加侧滑(BottomNavigationView+ViewPager+Fragment)

废话不多说,先上图,不合适的就不用再往下面看了,这是平时找东西最想先看到的。                   具体实现 1、默认使用Android Studio开发,首先新建一个项目,选择Bottom Navigation Activity,这样底部导航功能就已经完成了。(我代码:compileSdkVersion 27) 2、添加ViewPager+Fragmen

你努力或许没人知道,但,不努力都看得出来! 3204

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android studio生产实习记录03——底部导航(menu+BottomNavigationView)

的

双人余公的博客 564

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 底部和导航栏重合_使用 flutter 实现一个底部导航栏

使用 flutter 实现一个底部导航栏现如今打开一个 App,比如微信、支付宝,都能看到一个底部导航栏,用来切换到不同的展示页。今天就用 Flutter 实现一下这种效果。在 Flutter 里,基本上所有的东西都是组件。Flutter 也已经有了现成的底部导航栏组件了 -- BottomNavigationBar,所以用 Flutter 实现底部导航,其实是很简单地一件事情,只需要知道怎么使用...

weixin_39939530的博客 403

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

安卓bottomnavigationview和drawlayout实现底部导航和侧滑布局

文章目录1.遇到的问题2.实现3.隐藏系统底部导航栏4.兼容刘海屏5.代码 1.遇到的问题 最近在开发一款app,初步的框架就是实现类似于qq布局的框架样式。那么就分为了两个部分。首先就是底部导航栏,使用bottomnavigationview和fragment可以实现,当然在创建项目时也可以使用AS默认的底部导航来进行项目创建。然后就是使用drawlayout实现侧滑的抽屉式布局。 虽然分析起来......

小马哥的博客 2767

底部导航BottomNavigationView+ViewPager+Fragment

Android端采用底部导航栏的APP非常多,比如微信、微博、支付宝...等等,这也不能说是盲目学习iOS,毕竟好东西大家都可以用,各家操作系统也都在博采众长,互相学习。Android端的底部导航栏有着一套规范, 详情 。 这篇文章为大家带来 1.官方BottomNavigationView的使用方法 2.结合ViewPager、Fragment实现一个流行UI布局! 3.

xiaoyangsavvy的专栏 1万+

BottomNavigationView(design包提供的一个组件)

BottomNavigationView实现底部导航栏。BottomNavigationView没有动画效果解决办法

lhp15575865420的博客 683

Android流行UI布局——底部导航(BottomNavigationView+ViewPager+Fragment)

前言: Android端采用底部导航栏的APP非常多,比如微信、微博、支付宝…等等,这也不能说是盲目学习iOS,毕竟好东西大家都可以用,各家操作系统也都在博采众长,互相学习。Android端的底部导航栏有着一套规范,详情。 这篇文章为大家带来 1.官方BottomNavigationView的使用方法 2.结合ViewPager、Fragment实现一个流行UI布局! 3.并用反射解决ViewPa

贵公子丶笔记 8761
上一篇: Android6.0 运行时权限
下一篇: Ripple水波纹
ApiPlayer
博客等级 码龄12年 34粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值