Android自定义NavigationController - 安卓自定义导航栏 --【WJ】

注意:

本文主要介绍安卓自定义顶部导航栏(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

<LinearLayout    
              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">

      <Button
              android:id="@+id/navigation_btn"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:text="展示NavigationBar"
              android:background="#aa0d3f"/>

</LinearLayout>
简要说明

就是一个按钮而已


1.2 -- 展示页面

activity_shownavigation.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
              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">

      <com.example.apple.complete_stretchlistview_for_wangjun.showCustomNavigationBar.WJNavigationBarActivity
              android:id="@+id/navi_main"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"/>

      <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello World"/>

</LinearLayout>
简要说明

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


1.3 -- Navigation布局页面

activity_wjnavigationbar.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
              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">

      <!-- navigationItemLeftButton -->
      <ImageView
              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"/>

      <!-- navigationItemTitle -->
      <TextView
              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"/>

      <!-- navigationItemRightButton -->
      <ImageView
              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"/>

</RelativeLayout>
简要说明

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


1.3 -- 资源

navigationbar_left_item_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:state_pressed="false" android:drawable="@drawable/navi_btn_back_n"/>
      <item android:state_pressed="true" android:drawable="@drawable/navi_btn_back_s"/>
</selector>

navigationbar_rigt_item_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:state_pressed="false" android:drawable="@drawable/navi_btn_right_n"/>
      <item android:state_pressed="true" android:drawable="@drawable/navi_btn_right_s"/>
</selector>
简要说明

这个资源的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~~

icon资源地址
链接:https://share.weiyun.com/1fe7867cfe261de78a6604c8a5dfe9fa (密码:d3Cf9J)


总结

希望大家喜欢我写的东西,转发收藏什么的,多多益善~
后面有时间的话,我会在这篇文章中加上相对完整和人性化的东西.
如果我找到设置全局Navigation的方法,我就会添加

  1. wjNavigationBarActivity.show( )
  2. wjNavigationBarActivity.dismiss( )

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,601评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,367评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,249评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,539评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,967评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,929评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,098评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,825评论 0 207
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,609评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,796评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,282评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,603评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,277评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,159评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,959评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,079评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,874评论 2 277

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,594评论 25 707
  • 内容抽屉菜单ListViewWebViewSwitchButton按钮点赞按钮进度条TabLayout图标下拉刷新...
    皇小弟阅读 46,429评论 22 663
  • 今天获准可以从青岛回京,很是兴奋,搭上一量出租车从城阳区奔赴青岛站,司机是个不错的人,聊了很多青岛,城市,以及他年...
    Emiedon阅读 145评论 0 0
  • 移动互联网时代,企业的推广方法是,决定企业发展的生死棋。有80%的企业家通常只关注如何加大推广预算,却从来没有去思...
    万杰博客阅读 1,070评论 2 3
  • 听 是孩童银铃般的笑声 是音符在钢琴上跳动 是来来往往的车行 是高跟鞋的踢哒 是微风吹乱树叶 是知了的鸣叫 是夜晚...
    空瓶小宅阅读 164评论 0 3