注意:

本文主要介绍安卓自定义顶部导航栏(iOS中成为NavigationBar);写的不尽如人意的地方,请见谅~

概述如下:

环境 :Android Studio 1.4 for Mac

语言 :如果我没猜错的话,应该是Java

特点 :简单、直接、暴力,绝对让你有快感!!!

展示

1.效果展示

自定义导航栏.gif

2.工程目录结构

目录结构.png

简要说明

主要用到的文件已为大家用黄色的方框标出来了;

- Java类

MainActivity:还用解释?

ShowNavigationActivity:展示自定义Navigation的类(iOS中可以理解为在ViewController中调用)

WJNavigationBarActivity:自定义Navigation

- 布局

activity_main:不解释

activity_shownavigation.xml:ShowNavigationActivity.java绑定的页面

activity_wjnavigationbar.xml:自定义Navigation布局页面

- 资源(我觉得这么叫就是对的!!!)

navigationbar_left_item_selector.xml:NavigationItemLetfButton

navigationbar_right_item_selector.xml:NavigationItemRightButton

各种以.png结尾的就是图片而已

1.开始写布局

1.1 -- 主页面

activity_main.xml

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context=".MainActivity">

android:id="@+id/navigation_btn"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="展示NavigationBar"

android:background="#aa0d3f"/>

简要说明

就是一个按钮而已

1.2 -- 展示页面

activity_shownavigation.xml

xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/navi_main"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World"/>

简要说明

把自定义Navigation添加到你要使用的页面中

1.3 -- Navigation布局页面

activity_wjnavigationbar.xml

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/rl_chat_title"

android:layout_width="match_parent"

android:layout_height="50dp"

android:background="#91c2ae"

android:layout_alignParentTop="true">

android:id="@+id/iv_navi_back"

android:layout_width="25dp"

android:layout_height="25dp"

android:background="@drawable/navigationbar_left_item_selector"

android:layout_marginLeft="10dp"

android:layout_marginStart="10dp"

android:layout_centerVertical="true"

android:layout_alignParentLeft="true"

android:layout_alignParentStart="true"/>

android:id="@+id/tv_navi_title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:text="自定义NavigationBar"

android:textSize="15dp"/>

android:id="@+id/iv_navi_right"

android:layout_width="25dp"

android:layout_height="25dp"

android:background="@drawable/navigationbar_right_item_selector"

android:clickable="true"

android:layout_centerVertical="true"

android:layout_alignParentRight="true"

android:layout_alignParentEnd="true"

android:layout_marginRight="10dp"

android:layout_marginEnd="10dp"/>

简要说明

这个页面采用的是相对布局,我本人是很中意这种布局的,因为和Masonry很像

1.3 -- 资源

navigationbar_left_item_selector.xml

navigationbar_rigt_item_selector.xml

简要说明

这个资源的xml主要作用是让按钮的icon有两种效果,一个是默认效果,一个是选中效果;

在1.2页面布局中有所引用,如下:

android:background="@drawable/navigationbar_left_item_selector"

android:background="@drawable/navigationbar_right_item_selector"

2.开始写代码

2.1 MainActivity.java

public class MainActivity extends AppCompatActivity

{

private Button navigation_btn; /// 展示自定义NavigationBar

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setTitle("做着玩的");

initView(); /// 初始化控件

selectorMethod(); /// 点击事件

}

/*** * 初始化控件 */

public void initView()

{

navigation_btn = (Button) findViewById(R.id.navigation_btn);

}

/*** * 按钮点击事件 */

public void selectorMethod()

{

// 展示自定义NavigationBar

navigation_btn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

System.out.println("展示自定义NavigationBar");

// 跳转页面

Intent intent = new Intent(MainActivity.this, ShowNavigationActivity.class);

startActivity(intent);

}

});

}

}

2.2 ShowNavigationActivity.java

public class ShowNavigationActivity extends Activity

{

private WJNavigationBarActivity wjNavigationBarActivity; // 调用自定义Navigation的Java类

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_shownavigation);

initView(); /// 初始化控件

}

/*** * 初始化 */

public void inieView()

{

wjNavigationBarActivity = (WJNavigationBarActivity) super.findViewById(R.id.navi_main);

wjNavigationBarActivity.setTitle("自定义导航栏");

// Java中叫回调,iOS中叫Block

wjNavigationBarActivity.setClickCallback(new WJNavigationBarActivity.ClickCallback() {

/*** * 返回按钮 */

@Override

public void onBackClick() {

System.out.println("返回按钮");

System.out.println("写你的逻辑呗~");

}

/*** * 右侧按钮 */

@Override

public void onRightClick() {

System.out.println("右侧按钮");

System.out.println("写你的逻辑呗~");

}

}

}

}

2.3 WJNavigationBarActivity.java

public class WJNavigationBarActivity extends RelativeLayout implements View.OnClickListener

{

private ImageView iv_navi_back; // 返回按钮

private TextView tv_navi_title; // 中间的标题

private ImageView iv_navi_right; // 右边的按钮

public WJNavigationBarActivity(Context context)

{

this(context,null);

}

public WJNavigationBarActivity(Context context,AttributeSet attrs)

{

super(context,attrs);

View view = LayoutInflater.from(context).inflate(R.layout.activity_wjnavigationbar,this,true);

iv_navi_back = (ImageView) findViewById(R.id.iv_navi_back);

iv_navi_back.setOnClickListener(this);

tv_navi_title = (TextView) findViewById(R.id.tv_navi_title);

iv_navi_right = (ImageView) findViewById(R.id.iv_navi_right);

iv_navi_right.setOnClickListener(this);

}

/***

* 获取返回按钮

* @return iv_navi_back

*/

public ImageView getIv_navi_back()

{

return iv_navi_back;

}

/***

* 获取标题

* @return tv_navi_title

*/

public TextView getTv_navi_title()

{

return tv_navi_title;

}

/***

* 设置标题

* @param title

*/

public void setTitle(String title)

{

tv_navi_title.setText(title);

}

/***

* 获取右边的按钮

* @return iv_navi_right

*/

public ImageView getIv_navi_right()

{

return iv_navi_right;

}

private ClickCallback callback; // 声明回调函数

/***

* 设置按钮点击回调的接口

* @param callback

*/

public void setClickCallback(ClickCallback callback)

{

this.callback = callback;

}

/***

* 导航栏点击回调接口 -- Block中的回调方法

* 如若需要标题可点击,可再添加

*/

public static interface ClickCallback

{

void onBackClick();

void onRightClick();

}

/***

* 点击事件

*/

@Override

public void onClick(View v)

{

int id = v.getId();

if (id == R.id.iv_navi_back)

{

callback.onBackClick();

return;

}

if (id == R.id.iv_navi_right)

{

callback.onRightClick();

return;

}

}

}

简要说明

这个类你可以理解为一个接口类,哪用哪调用呗,毕竟在安卓中我还是个小Baby(真TM无耻);

我在想,安卓肯定有一个和iOS一样的全局设置Navigation的方法,只是我不知道,所以我是小baby~~

总结

希望大家喜欢我写的东西,转发收藏什么的,多多益善~

后面有时间的话,我会在这篇文章中加上相对完整和人性化的东西.

如果我找到设置全局Navigation的方法,我就会添加

wjNavigationBarActivity.show( )

wjNavigationBarActivity.dismiss( )

最后,如果你有更好的,请回复我,并粘贴你的资料地址。

有事私信

WangJun 20161228

android 顶部导航栏 自定义,Android自定义NavigationController - 安卓自定义导航栏 --【WJ】...相关推荐

  1. android 单手模式 cm,怎么开启单手模式 安卓自定义单手操作模式缔造教程

    手机屏幕做大了对于我们爪机党来说自然是视觉上的福利,但是大屏相反的给我们的操作带来了诸多的不便.相比不少厂家的定制和第三方ROM而言,一部大屏手机必须有一个合适的操作方式.单手模式自然是福利,但也不是 ...

  2. android自定义文件选择,关于安卓自定义本地文件选择库的实现

    最近想重温一下旧知识,所以写了这一个库. androidx+kotlin 功能有:(1)多线程本地文件扫描 (2)ContentProvider扫描 注意:若使用本地扫描时,出现错误,请看文章:htt ...

  3. Android 12系统源码_SystemUI(五)自定义状态栏和导航栏视图

    前言 前面几篇文章我们具体分析了Android12系统原生的StatusBar和CarStatusBar的启动流程以及视图构建流程,本篇文章我们来自定义实现状态栏和导航栏视图. 一.为系统添加自定义状 ...

  4. Android 11.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果

    目录 1.概述 2.自定义仿小米全面屏手势导航返回ui布局的核心代码 3.自定义左右手势返回UI样式的核心代码功能分析 3.1 NavigationBarView手势导航布局左右手势返回的相关代码 3 ...

  5. android分享的主标题,Android 自定义标题栏(title栏)

    近日 需要在android的标题栏上添加按钮,所以对android的标题栏进行了一下简单的研究- 第一步,向实现自定义标题栏,需要在onCreate方法里这样写 requestWindowFeatur ...

  6. android顶部导航高度,快速实现顶端导航栏(ToolBar+TabLayout+Viewpager)

    1.前言 在Android开发前期时,实现一个业务分明的导航栏对后面各业务开发与解耦都有重要意义.现在各种厂商的导航栏样式都比较类似,Tab型的导航是当下被大家所选择的形式,今天我们就来快速搭建一个T ...

  7. Android 12.0 自定义仿小米全面屏手势导航左右手势滑动返回UI效果

    目录 1.概述 2.自定义仿小米全面屏手势导航左右手势滑动返回UI效果的核心类

  8. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  9. 【小程序自定义组件,冒泡,自定义导航栏,页面栈】

    自定义组件 在根目录新建一个components的文件夹----新建一个文件夹post----新建一个compont文件也叫post 创建完之后 post.json就自动配置好了 {"com ...

最新文章

  1. Linux Kernel TCP/IP Stack — L2 Layer — switchdev L2 Offload
  2. Eclipse错误提示: Symbol 'xxxx' could not be resolved
  3. Python Pandas –合并,联接和串联
  4. 轨迹规划当中用到的多项式插值和样条曲线
  5. Java并发/多线程教程——1
  6. oracle 12c pdb开启和关闭,及设置开机自启动
  7. linux shell下除了某个文件外的其他文件全部删除的命令
  8. 原型 继承 原型链 闭包
  9. 将数据库表中的数据读出以xml的形式下载到手机端
  10. dex2jar工具及问题
  11. 去中心化的联邦学习专栏
  12. 2015年讲师评选正式开始,培训行业讲师年终总结啦!!
  13. 支配树 / Dominator_Tree(待补)
  14. php unshift,PHP Ds\Vector unshift()用法及代码示例
  15. 【办公常用软件】万彩办公大师教程丨PDF OCR 帮助文档
  16. 2023款16英寸苹果MacBook Pro续航实测
  17. 2014年新年PMP校友会
  18. Three.js相机对象(正投影OrthographicCamera、透视投影PerspectiveCamera)
  19. h5网页在微信客户端打开,上传图片不能调用相机
  20. 06,JavaScript自定义菜单

热门文章

  1. LV.12 嵌入式系统驱动高级
  2. 随手记投资安全吗?查看网贷投资理财平台的风控
  3. 统计学原理 数据的预处理
  4. JS中如何通过鼠标滚轮控制横向滚动轴滚动
  5. 献给技术小白的一段话
  6. 智慧教室_数字化美术教室解决方案
  7. Python 99数乘表终端输出
  8. php 怎么输出m3u,m3u文件扩展名,m3u文件怎么打开?
  9. python中乘号可以省略吗_字母之间的乘号为什么可以省略不写?
  10. 2021达旗一中高考成绩查询,2019内蒙古高考喜报汇总