原生Android 侧滑菜单实践(部分)
此为第一个制作侧滑菜单的实践 。
此部分仅仅为部分实践:
仅缺menu的字符串布局,以及需要修改的MainActivity.java文件,也是需要主要修改的地方。
从使用MD设计-进行侧滑菜单的制作(activity_main.xml部分)仍然可看。
当中为了向前兼容以及使用Material Design,参考了约10个链接。
文件路径、参考链接为文章末尾,为了更好的阅读体验,增加了文件源代码展示(部分代码有删改)。
使用MD设计
设置向前兼容
进行4.0系统的一些工作
参考链接-向前兼容-1
首先准备添加MD设计包,但考虑到Android Icecream(4.0)仅为14,参考链接中得知Appcomat为21,所以先做以下调整:
- build.gradle:
android {compileSdkVersion 21defaultConfig {applicationId "product.felixxiong.com.MyPackgeName"minSdkVersion 14targetSdkVersion 21versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}
...
dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:21.0.+' //导入Appcompat依赖5.0的21并随时获取可用新版本implementation 'com.android.support.v7.widget.SwichCompat'//导入支持MD的switch控件implementation 'com.android.support:design.21' //导入21设计库:参考链接:复制代码
values相关xml文件
- 新建values/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources><style name="AppTheme" parent="AppTheme.Base"/><style name="AppTheme.Base" parent="Theme.AppCompat"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimary</item><item name="windowNoTitle">true</item><item name="windowActionBar">false</item></style>
</resources>
复制代码
- 新建values-v21/themes.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="AppTheme.Base"><item name="android:windowContentTransitions">true</item><item name="android:windowAllowEnterTransitionOverlap">true</item><item name="android:windowAllowReturnTransitionOverlap">true</item><item name="android:windowSharedElementEnterTransition">@android:transition/move</item><item name="android:windowSharedElementExitTransition">@android:transition/move</item>
</style>
</resources>
复制代码
添加依赖
参考链接:向前兼容
apply plugin: 'com.android.application'allprojects {repositories {google()jcenter()}
}
...
dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:21.0.+' //导入Appcompat依赖5.0的21并随时获取可用新版本implementation 'com.android.support.v7.widget.SwichCompat'//导入支持MD的switch控件implementation 'com.android.support:design.21' //导入21设计库implementation 'com.android.support.constraint:constraint-layout:1.1.2'//implementation 'com.google.android.material:material:1.0.0-rc01'
复制代码
使用Toolbar替换Action Bar
参考链接-向前兼容-1
- active_main.xml:
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:theme="@style/Theme.AppCompat.NoActionBar" /> <!--参考链接:关于toolbar-4--><!--android:background="?attr/colorPrimaryDark"-->android:background="#3F51B5"> <!--Toolbar可自定义颜色-->
</android.support.v7.widget.Toolbar>
复制代码
- MainActivity.java:
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(getLayoutResource()); //getLayoutResource()此处需要获取布局文件R.layout.……Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //主要关于Toolbar的代码if(toolbar != null) {setSupportActionBar(toolbar);}}
复制代码
进行侧滑菜单的制作
布局文件
导航栏布局
activity_main.xml
- 设定material.navigation.NavigationView
参考链接:Material Design
<com.google.android.material.navigation.NavigationViewandroid:id="@+id/left_navigation_drawer"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start" <!--layout_gravity指定重力-->app:headerLayout="@layout/navigation_header" <!--设置navigation头布局-->app:menu="@menu/my_navigation_items"> <!--设置navigation导航布局--><!--android:dividerHeight="0dp"android:background="#111"--/></com.google.android.material.navigation.NavigationView></android.support.v4.widget.DrawerLayout>
复制代码
设置布局,在相应目录下新建文件:
layout\navigation_header.xml
menu\my_navigation_items
android:dividerHeight="0dp"
复制代码
此处代码链接为开发者文档,MD可能不需要两行代码。
- 添加Framelayout
此处链接为开发者文档。
<FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/decor_content_frame"> <!--主内容视图必须为第一个视图,抽屉式导航必须位于内容顶部--><android.support.v7.widget.Toolbar ... /></FrameLayout>
复制代码
菜单头部布局
navigation_header.xml
参考链接:侧滑菜单-1
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="?attr/colorPrimary"android:gravity="center"android:orientation="vertical"android:paddingBottom="50dp"android:paddingTop="50dp"android:theme="@style/ThemeOverlay.AppCompat.Dark"><com.google.android.material.internal.VisibilityAwareImageButton android:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@mipmap/ic_launcher"/><android.support.v7.widget.AppCompatTextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="5dp"android:text="demo"/></LinearLayout>
复制代码
菜单项布局
my_navigation_items
此处参考链接:侧滑菜单-1,因为开发者文档中使用Adpter方法实现填充,需要深入了解Adpter,故未加入。
JAVA文件()
Main Activity.java
参考链接:侧滑菜单-1
- 初始化抽屉导航栏列表
public class MainActivity extends AppCompatActivity {@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}private Toolbar toolbar; //此处Toolbar修改为自己习惯的写法,为变量private String[] mTitles; //创建标题变量private DrawerLayout mDrawerLayout; //创建抽屉视图变量private NavigationView mDrawerNavgation; //创建侧滑菜单视图变量//private ActionBarDrawerToggle mDrawerToggle; 在后文中出现//创建Toobar的子类作为监听器,需要在生命周期中调用togge//private CharSequence mDrawerTitle;//private CharSequence mTitle;...@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//mTitles = R.layout.activity_main.getStringArray(R.array.Titles_array); //初始化界面//此处Toolbar修改为自己习惯的写法,实例化Toolbar写一起Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);onCreateOptionsMenu(R.layout.activity_main);toolbar.setTitle("My Title");setSupportActionBar(toolbar);mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);mDrawerNavgation = (NavigationView) findViewById(R.id.left_navigation_drawer);mDrawerNavgation.setAdapter(new ArrayAdapter<String>(this, R.layout.drawer_layout, mTitles)); //为列表视图设置适配器mDrawerNavgation.setOnItemClickListener(new DrawerItemClickListener()); //调用接收点击事件,设置点击监听器}...}
}
复制代码
- 处理导航点击事件
private class DrawerItemClickListener implements NavigationView.OnItemClickListener { //开始处理导航事件:在用户选择某一项时实现接口更改内容视图@Override //这里开始调用onItemClickpublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {selectItem(position);}}private void selectItem(int position) {Fragment fragment = new Fragment(); //封装一个新片段并指定要根据位置显示的Bundle args = new Bundle();args.putInt(Fragment.ARG_LIST_NUMBER, position);fragment.setArguments(args);FragmentManager fragmentManager = getFragmentManager(); //通过替换任何现有片段插入片段fragmentManager.beginTransaction() //将不同的FrameLayout插入内容主视图.replace(R.id.decor_content_frame, fragment).commit();// Highlight the selected item, update the title, and close the drawermDrawerNavgation.setItemChecked(position, true);setTitle(mTitles[position]);mDrawerLayout.closeDrawer(mDrawerNavgation);}@Overridepublic void setTitle(CharSequence title) {mTitle = title;getActionBar().setTitle(mTitle);}
复制代码
3.侦听打开和关闭事件
public class MainActivity extends AppCompatActivity {private ActionBarDrawerToggle mDrawerToggle; //创建Toobar的子类作为监听器,需要在生命周期中调用toggeprivate CharSequence mDrawerTitle;private CharSequence mTitle;...@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
...mTitle = mDrawerTitle = getTitle();mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {/** Called when a drawer has settled in a completely closed state. */public void onDrawerClosed(View view) {super.onDrawerClosed(view);getActionBar().setTitle(mTitle);invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()}/** Called when a drawer has settled in a completely open state. */public void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);getActionBar().setTitle(mDrawerTitle);invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()}};mDrawerLayout.setDrawerListener(mDrawerToggle); //将抽屉切换设置为DrawerListenergetActionBar().setDisplayHomeAsUpEnabled(true);getActionBar().setHomeButtonEnabled(true);}/* Called whenever we call invalidateOptionsMenu() */@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {// If the nav drawer is open, hide action items related to the content viewboolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerNavgation);menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);return super.onPrepareOptionsMenu(menu);}
}
复制代码
- 通过应用图标打开和关闭
mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
//通过应用图标打开或关闭抽屉导航栏mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, /* DrawerLayout object */R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */R.string.drawer_open, /* "open drawer" description */R.string.drawer_close /* "close drawer" description */) {public void onDrawerClosed(View view) { //当抽屉处于完全关闭状态时调用。super.onDrawerClosed(view);//getActionBar().setTitle(mTitle); //设置标题}public void onDrawerOpened(View drawerView) { //当抽屉处于完全状态时调用。super.onDrawerOpened(drawerView);//getToolBar().setTitle(mDrawerTitle); //设置标题}};mDrawerLayout.setDrawerListener(mDrawerToggle); 将抽屉切换设置为DrawerListenergetActionBar().setDisplayHomeAsUpEnabled(true);getActionBar().setHomeButtonEnabled(true);}@Overridepublic boolean onPrepareOptionsMenu(Menu menu) { //每当我们调用invalidateOptionsMenu()时调用boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerNavgation); //如果导航抽屉已打开,请隐藏与内容视图相关的操作项menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);return super.onPrepareOptionsMenu(menu);}
}@Overrideprotected void onPostCreate(Bundle savedInstanceState) { //在生命周期中调用ActionBarDrawerTogglesuper.onPostCreate(savedInstanceState);mDrawerToggle.syncState(); 在onRestoreInstanceState发生后同步切换状态。}@Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);mDrawerToggle.onConfigurationChanged(newConfig);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Pass the event to ActionBarDrawerToggle, if it returns// true, then it has handled the app icon touch eventif (mDrawerToggle.onOptionsItemSelected(item)) {return true;}// Handle your other action bar items...return super.onOptionsItemSelected(item);}
复制代码
文件全部代码
build.gradle
allprojects {repositories {google()jcenter()}
}android {compileSdkVersion 21defaultConfig {applicationId "product.penghaoxiong.com.androidquickcheck"minSdkVersion 14targetSdkVersion 21versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.android.support:appcompat-v7:21.0.+' //导入Appcompat依赖5.0的21并随时获取可用新版本implementation 'com.android.support.v7.widget.SwichCompat'//导入支持MD的switch控件implementation 'com.android.support:design.21' //导入21设计库implementation 'com.android.support.constraint:constraint-layout:1.1.2'//implementation 'com.google.android.material:material:1.0.0-rc01'testImplementation 'junit:junit:4.12'androidTestImplementation 'com.android.support.test:runner:1.0.2'androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
复制代码
参考链接
关于向前兼容
- AppCompat 21实现低版本手机使用Material Design
- 在低版本Android上使用Material Design——AppCompat v21
- 如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion
关于Toolbar
- android:ToolBar详解(手把手教程)
- 利用Toolbar替换ActionBar
- ToolBar替代ActionBar
Material Design
- Navigation Views
侧滑菜单
- Android 实现侧滑菜单-design
路径
build.gradle:app\build.gradle
MainActivity.java:app\src\main\java\product\felixxiong\com\check\MainActivity\MainActivity.java
active_main.xml:app\src\main\res\layout\active_main.xml
layout:
layout\navigation_header.xml
values:app\src\main\res\values
values/themes.xml
values-v21/themes.xml
原生Android 侧滑菜单实践(部分)相关推荐
- android自定义侧滑菜单代码,原生Android 侧滑菜单实践(部分)
此为第一个制作侧滑菜单的实践 . 此部分仅仅为部分实践: 仅缺menu的字符串布局,以及需要修改的MainActivity.java文件,也是需要主要修改的地方. 从使用MD设计-进行侧滑菜单的制作( ...
- Android 侧滑菜单(抽屉)的使用总结
侧滑菜单这种设计,在很多 APP 上面都有看到,例如大版本3.0之前的知乎.网易新闻.滴滴打车等.有些热衷于 Android Material Design 的开发者,甚至将一些 IOS 化的 And ...
- android侧滑菜单ui,Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
DrawerLayout与Fragment的联用 1.xml代码 xmlns:android="http://schemas.android.com/apk/res/android" ...
- android 点击侧滑代码,代码分析Android实现侧滑菜单
Android 侧滑菜单的实现,参考网上的代码,实现侧滑菜单.最重要的是这个动画类UgcAnimations,如何使用动画类来侧滑的封装FlipperLayout. 1.实现效果 2.动画类UgcAn ...
- AndroidStudio安卓原生开发_UI高级_DrawerLayout_侧滑菜单控件---Android原生开发工作笔记120
然后我们再来看一个UI控件,侧滑菜单. 上面是文字描述,我们去做一下. 我们到activity_main.xml中去 我们先去写第一个子view,是内容显示区域.就是用来显示我们 侧滑菜单的区域 然后 ...
- Android 自定义控件打造史上最简单的侧滑菜单
侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin ...
- Android仿QQ侧滑菜单
先上效果图: GIF图有点模糊,源码已上传Github:Android仿QQ侧滑菜单 ####整体思路: 自定义ItemView的根布局(SwipeMenuLayout extends LinearL ...
- Android自定义View之仿QQ侧滑菜单实现
最近,由于正在做的一个应用中要用到侧滑菜单,所以通过查资料看视频,学习了一下自定义View,实现一个类似于QQ的侧滑菜单,顺便还将其封装为自定义组件,可以实现类似QQ的侧滑菜单和抽屉式侧滑菜单两种菜单 ...
- Android自定义顶部栏及侧滑菜单和fragment+viewpag滑动切换的实现
嘿嘿嘿,关于android滑动的操作,是不是经常都会用到呢. 我肯定也要学习一下啦. https://blog.csdn.net/u013184970/article/details/82882107 ...
最新文章
- CCF CSP 201609-2 火车购票(90分,怎么也检查不出来问题在哪儿,导致不能满分??)
- tp论坛 分页(三)
- 登山(信息学奥赛一本通-T1283)
- python画太极八卦图_太极八卦图的正确画法
- 无连接可靠传输_计算机网络-网络层和传输层
- 别看微信,微博,头条用户都很多,自媒体作者也很多
- django+xadmin在线教育平台(四)
- android在副屏中运行一个应用_android一个app打开另一个app的指定页面
- Google Calendar Sync_ 把 Microsoft Outlook 同步到 G...
- c++语言 进行验证码识别,C++ 借助 Tesseract-OCR 识别乐讯新版验证码
- JDE 系统表(标准表)
- 一个毕业生的年终总结
- 3dmax中如何导入照片为背景
- CentOS7 ifup 和 ifdown
- 常见工具识别集锦-Windows应急响应工具
- ARKit之路-ARKit概述之一
- paddle复现colorGAN(动漫黑白线条上色)
- 解决问题:Oracle存储过程执行成功,但数据没有变化
- java:获取本机IP,Linux环境下使用InetAddress.getLocalHost()方法获得127.0.0.1
- goldenboy机器人_急求阿西莫夫机器人,基地,帝国三大系列的书名及其简介