精华内容
下载资源
问答
  • ToolBar使用方法详解

    2021-01-05 12:40:27
    ToolBar的出现是为了替换之前的ActionBar的各种不灵活使用方式,相反,ToolBar使用变得非常灵活,因为它可以让我们自由往里面添加子控件.低版本要使用的话,可以添加support-v7包. 今天要实现的效果如下: 由上图...
  • Android toolbar 使用详解

    2018-08-14 16:49:06
    Android toolbar 使用详解,一个不错的学习toolbar的例子,里面包括各种toolbar用法
  • 主要介绍了Django 开发调试工具 Django-debug-toolbar使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • android Toolbar 使用

    2021-01-03 19:53:10
    1、导航控制器:  google 为了统一导航 android3.0 出来了 ActionBar, ActionBar使用比较费劲 ...2. 使用toolbar 2.1 添加依赖 compile 'com.android.support:design:27.1.1' 2.2. 布局  2.3. 设置主题 
  • 主要为大家详细介绍了Android自定义Toolbar使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 一个VB6.0的toolbar使用示范,toolbar是很好用的控件
  • SearchView+Toolbar使用

    2018-11-16 17:34:39
    Toolbar上显示菜单项其中包括SearchView,SearchView各事件函数的处理以及结合ListView实现边输入边提示搜索关键字列表的功能。博客地址:https://blog.csdn.net/gaoxiaoweiandy/article/details/83999117
  • Toolbar的11个使用例子,详见文章:https://blog.csdn.net/baidu_41616022/article/details/117912975
  • Toolbar使用详解

    2017-05-27 17:00:35
    详细介绍了Toolbar使用过程
  • 比ActionBar更优秀的ToolBar使用实例 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
  • android下导航栏ToolBar使用示例,包含添加菜单、菜单事件、Title、图标等功能
  • Toolbar使用Demo,透明状态栏及透明度渐变,博客链接http://blog.csdn.net/u011697203/article/details/64126087
  • ToolBar使用教程(小白快速上手)

    千次阅读 2018-06-11 14:33:15
    ToolBar效果展示:(做工粗糙,有...这里说明下啊,使用ToolBar能都实现和ActionBar 一样的效果.那么问题来了,为什么Google官方还要推荐toolbar来替代actionbar呢? 第一点,要知道Google于2015年引入Material Desig...

     

    ToolBar效果展示:(做工粗糙,有那个意思就行了)

    这里写图片描述

    概述:

    在toolbar出来之前,对于标题栏的操作,小伙伴接触比较多的应该是ActionBar了.这里说明下啊,使用ToolBar能都实现和ActionBar 一样的效果.那么问题来了**,为什么Google官方还要推荐toolbar来替代actionbar呢?**

    第一点, 要知道Google于2015年引入Material Design风格的控件,Android SDK中的ActionBar每个版本都会做一些改变, 所以在不同的系统上看起来可能会不一样,导致严重的碎片化问题,于是谷歌在更新android-support-v7兼容包时引入了ToolBar,用来替代ActionBar,它推荐开发者使用兼容包中的ToolBar,而非SDK中的ActionBar,以期解决碎片化问题

    第二点, 还有一个原因就是ActionBar的可操作性比不上ToolBar.主要是因为toolbar的使用需要在layout.xml中进行定义,而actionbar的使用则不存在这种定义方式. 那么当进行某些参数调节的时候,toolbar可能只需在xml布局文件中定义toolbar的时候添加一个属性就可以了.而action则比较麻烦.这一点可以在Android Studio环境下ActionBar的使用教程以及如何解决遇到的问题找到部分佐证.

    使用方法:

    Step1.
    为了之后设定方便,我们先在 res/values/styles.xml 里增加一个名为 AppTheme.Base 的风格

    1).在 res/values/styles.xml中,添加

    
        <style name="AppTheme.Base" parent="Theme.AppCompat">
            <!-- 如果报错AppCompat does not support the current theme features....则去除前缀:android -->
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
            
            <!--Window color-->
            <item name="android:windowBackground">@color/dim_foreground_material_dark</item>
    
            <!-- colorPrimary 应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色-->
            <item name="colorPrimary">@color/colorPrimary</item>
        </style>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="AppTheme.Base">
        </style>
    

    2).在 /res/values-v21/styles.xml中

    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="AppTheme.Base">
            <!--Navigation bar color-->
            <item name="android:navigationBarColor">@color/accent_material_light</item>
        </style>
    

     
    科普一下,正常情况下,当使用as新建一个工程时,style中默认主题中的参数指标的对应意义,了解一下.

    <resources>
        <!-- Base application theme. -->
        <style name="Theme.AppCompat" parent="Theme.AppCompat.Light.DarkActionBar">
             <!-- 1.colorPrimary 应用的主要色调,actionBar默认使用该颜色,Toolbar导航栏的底色-->
            <item name="colorPrimary">@color/colorPrimary</item>
    
            <!-- 2.statusBarColor 状态栏(通知栏)颜色,默认使用colorPrimaryDark-->
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    
            <!-- 3.colorAccent—控件选中后颜色-->
            <item name="colorAccent">@color/colorAccent</item>
        </style>
    </resources>

     
    Step2.
    在layout布局中定义toolbar.

        <!--todo  android:background="?attr/colorPrimary"y沿用actionbar的颜色设定-->
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:contentInsetStartWithNavigation="0dp">
    
        </android.support.v7.widget.Toolbar>
    

    请记得用 support v7 里的 toolbar,不然然只有 API Level 21 也就是 Android 5.0 以上的版本才能使用。
     
    Step3.
    定义tool_menu.xml文件,用于toolbar标题栏中各种action按钮的展示.

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context="com.example.zq.actionbardemo.ThirdActivity">
    
        <item
            android:id="@+id/action_query"
            android:title="搜索"
            android:icon="@mipmap/ic_action_query"
            app:showAsAction="always"
            app:actionViewClass="android.widget.SearchView" />
    
        <!--todo orderInCategory越大优先级越低-->
        <item
            android:id="@+id/action_download"
            android:title="下载"
            android:icon="@mipmap/ic_action_download"
            android:orderInCategory="100"
            app:showAsAction="always" />
    
    
        <item
            android:id="@+id/action_edit"
            android:title="编辑"
            android:icon="@mipmap/ic_action_edit"
            android:orderInCategory="90"
            app:showAsAction="always" />
    
        <item
            android:id="@+id/action_delete"
            android:title="删除"
            android:icon="@mipmap/ic_action_delete"
            android:orderInCategory="80"
            app:showAsAction="always" />
    
    </menu>

     
    Step4.
    在MainActivity.java中加载toolbar的menu资源

     @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.toolbar_menu,menu);
            return super.onCreateOptionsMenu(menu);
        }

     
    Step5.
    在 MainActivity.java 中加入 Toolbar 的声明:

      @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = findViewById(R.id.toolbar);
    
            // App Logo
            toolbar.setLogo(R.mipmap.return_icon);
            // Title
            toolbar.setTitle("My Title");
            // Sub Title
            toolbar.setSubtitle("Sub title");
    
            setSupportActionBar(toolbar);
    
            // Navigation Icon 要設定在 setSupoortActionBar 才有作用
            // 否則會出現 back button
            toolbar.setNavigationIcon(R.mipmap.return_icon);
            toolbar.setOnMenuItemClickListener(onMenuItemClick);
        }
    
        private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                String msg = "";
                switch (menuItem.getItemId()) {
                    case R.id.action_edit:
                        msg += "Click edit";
                        break;
                    case R.id.action_delete:
                        msg += "Click delete";
                        break;
                    case R.id.action_download:
                        msg += "Click download";
                        break;
                }
    
                if(!msg.equals("")) {
                    Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
                }
                return true;
            }
        };

     
    对上述代码做简要说明.
    1.setNavigationIcon: 即设定 up button 的图标,因为 Material 的介面,在 Toolbar这里的 up button样式也就有別于过去的 ActionBar 哦。
    2. setLogo: APP 的图标。
    3. setTitle: 主标题。
    4. setSubtitle: 副标题。
    5. setOnMenuItemClickListener: 设定菜单各按鈕的动作。
    这边要留意的是setNavigationIcon需要放在 setSupportActionBar之后才会生效

    最后对ToolBar中用于调节的各个参数指标进行总结下.
    • colorPrimaryDark
      状态栏背景色。
      在 style 的属性中设置。
    • textColorPrimary
      App bar 上的标题与更多菜单中的文字颜色。
      在 style 的属性中设置。
    • App bar 的背景色
      Actionbar 的背景色设定在 style 中的 colorPrimary。
      Toolbar 的背景色在layout文件中设置background属性。
    • colorAccent
      各控制元件(如:check box、switch 或是 radoi) 被勾选 (checked) 或是选定 (selected) 的颜色。
      在 style 的属性中设置。
    • colorControlNormal
      各控制元件的预设颜色。
      在 style 的属性中设置
    • windowBackground
      App 的背景色。
      在 style 的属性中设置
    • navigationBarColor
      导航栏的背景色,但只能用在 API Level 21 (Android 5) 以上的版本
      在 style 的属性中设置

    OK,完结.有疑问请留言.

     
    另外给大家推荐一个比较好的参考博文,上面讲的比较详细.
    android:ToolBar详解(手把手教程)

    展开全文
  • ToolBar使用详解

    千次阅读 2017-08-10 09:25:18
    转载请注明出处:http://blog.csdn.net/evan_man/article/details/51684947注意:使用ToolBar的话,一定要将当前Activity或者Application的Theme设置为NoActionBar样式,如 name=”AppTheme” parent=”Theme....
    请尊重他人劳动成果,请勿随意剽窃,转载请注明,谢谢!转载请注明出处:http://blog.csdn.net/evan_man/article/details/51684947

    注意:使用ToolBar的话,一定要将当前Activity或者Application的Theme设置为NoActionBar样式,如<style name=”AppTheme” parent=”Theme.AppCompat.Light.NoActionBar”>,否则ActionBar和ToolBar两者都会显示,而且setSupportActionBar方法将会抛出异常,其实使用了ToolBar完全可以把ActionBar抛到一边去,只是使用ToolBar就能完成所有ActionBar的功能。

        ToolBar是在Android5.0中提出来的,ActionBar在Android3.0提出来的。ActionBar是系统为我们创建一个View并显示在应用的顶端,直接继承自Object,因此我们如果要对这块内容的视图进行定制就需要严格按照ActionBar的方式进行工作。ToolBar是一个继承自ViewGroup的控件,因此我们可以用ViewGroup的方式去创建任何我们想要的视图内容,也可在布局文件中写入我们想要的内容,因此ToolBar比ActionBar更加灵活。同时ToolBar相对于ViewGroup的好处在于, 提供了更多便捷的方法来控制显示方式,这些方式主要是针对标题栏的特性而定制的,比如我们可以通过setTitle方法为其设置标题。 下图是网上找的Toolbar提供的便捷方法所对应的修改的内容:

    上图对应方法有:toolbar.setTitle(“AndroidViewDemo”); 、 toolbar.inflateMenu(R.menu.ac_toolbar_menu); 、 toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {…}等。
        Toolbar与ActionBar一样也支持对弹出菜单样式的修改,只不过在将Toolbar单独作为控件使用的情况下不能像ActionBar那样便捷地通过Theme来修改,Toolbar提供了一个setPopupTheme方法和对应的app.popupTheme属性来设置弹出菜单的样式。
        标题栏本身就是一个特殊的View为何不然View自己来处理呢?所以还是建议使用ToolBar的。如果你习惯了ActionBar那么你也可以在创建完Toolbar之后通过setSupportActionBar方法将Toolbar设置为当前Activity的ActionBar,之后的所有操作跟ActionBar都是一样的了。


    简单使用:

    一、编写菜单栏布局(标题栏右边最多显示三个Action,其余则隐藏)
    menu_main.xml
    1. <menu xmlns:android=“http://schemas.android.com/apk/res/android”  
    2.     xmlns:app=“http://schemas.android.com/apk/res-auto”>  
    3.     <item  
    4.         android:id=“@+id/menu_tool”  
    5.         android:icon=“@drawable/toolbar1”  
    6.         app:showAsAction=“ifRoom”  
    7.         android:orderInCategory=“50”  
    8.         android:title=“Tool”>  
    9.     </item>  
    10.     <item  
    11.         android:id=“@+id/menu_finder”  
    12.         android:icon=“@drawable/toolbar2”  
    13.         app:showAsAction=“ifRoom”  
    14.         android:orderInCategory=“10”  
    15.         android:title=“Find”>  
    16.     </item>  
    17. </menu>  
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/menu_tool"
            android:icon="@drawable/toolbar1"
            app:showAsAction="ifRoom"
            android:orderInCategory="50"
            android:title="Tool">
        </item>
        <item
            android:id="@+id/menu_finder"
            android:icon="@drawable/toolbar2"
            app:showAsAction="ifRoom"
            android:orderInCategory="10"
            android:title="Find">
        </item>
    </menu>


    注意
        android:title=”XX”属性用于设置当该item在overflow menu显示时显示的文字内容。app:showAsAction=”ifRoom”  用于设置在有足够空间的情况下在toolbar中显示Action的图标。

    二、main_activity.xml布局文件中加入<Toolbar/>标签
    1. <android.support.v7.widget.Toolbar xmlns:android=“http://schemas.android.com/apk/res/android”  
    2.     xmlns:app=“http://schemas.android.com/apk/res-auto”  
    3.     android:id=“@+id/toolbar”  
    4.     android:layout_width=“match_parent”  
    5.     android:layout_height=“wrap_content”  
    6.     android:minHeight=“?attr/actionBarSize”  
    7.     android:background=“?attr/colorPrimary”  
    8.     app:contentInsetStart=“0dp”  
    9.     app:contentInsetLeft=“0dp”  
    10.     app:theme=“@style/MyToolBarTheme”  
    11.     app:titleTextAppearance=“@style/Toolbar.TitleText”  
    12.     >  
    13.     <!–此处可以加你想要的View控件,如同LinearLayout类似的使用–>  
    14. </android.support.v7.widget.Toolbar>  
    15.   
    16. <!–android:contentInsertStart  contentInsetLeft是没有效果的不能保证控件靠近左边显示–>  
    <android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:contentInsetStart="0dp"
        app:contentInsetLeft="0dp"
        app:theme="@style/MyToolBarTheme"
        app:titleTextAppearance="@style/Toolbar.TitleText"
        >
        <!--此处可以加你想要的View控件,如同LinearLayout类似的使用-->
    </android.support.v7.widget.Toolbar>
    
    <!--android:contentInsertStart  contentInsetLeft是没有效果的不能保证控件靠近左边显示-->


    ToolBar在此可以就看成一个普通的ViewGroup,因此它显示的位置可以随意设置,但是如果要模拟ActionBar的功能,则需要将其放置在视图的最顶部。

     三、Activity中获取ToolBar控件并做相应设置
    1、初始化
    1. protected void onCreate(Bundle savedInstanceState) {  
    2.         super.onCreate(savedInstanceState);  
    3.         toolbar = (Toolbar)findViewById(R.id.toolbar);  
    4.         toolbar.setNavigationIcon(R.mipmap.back);   
    5.         //设置标题栏左边的图标样式,对应id为android.id.home ,用于返回上一级目录  
    6.         setSupportActionBar(toolbar);  
    7.         //将ToolBar对象设置为当前Activity的ActionBar  
    8. }  
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            toolbar = (Toolbar)findViewById(R.id.toolbar);
            toolbar.setNavigationIcon(R.mipmap.back); 
            //设置标题栏左边的图标样式,对应id为android.id.home ,用于返回上一级目录
            setSupportActionBar(toolbar);
            //将ToolBar对象设置为当前Activity的ActionBar
    }
    2、加载显示Menu布局,重写Activity的onCreateOptionMenu方法
    1. @Override  
    2.     public boolean onCreateOptionsMenu(Menu menu) {  
    3.         getMenuInflater().inflate(R.menu.menu_main, menu);  
    4.         return true;  
    5. }  
    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
    }

    3、监听标题栏中的点击事件
    1. @Override  
    2.     public boolean onOptionsItemSelected(MenuItem item) {  
    3.         switch (item.getItemId()){  
    4.             case R.id.menu_finder:  
    5.                 Toast.makeText(MainActivity.this,“touch finderItem”,Toast.LENGTH_SHORT).show();  
    6.                 AndroidUtils.changeActivity(this,SearchActivity.class); //跳转到搜索页Activity  
    7.                 break;  
    8.             case R.id.menu_tool:  
    9.                 Toast.makeText(MainActivity.this,“touch toolItem”,Toast.LENGTH_SHORT).show();  
    10.                 AndroidUtils.showPopupMenu(this,toolbar,R.menu.popmenu,new OnPopupMenuItemClickListener(this)); //弹出共享菜单  
    11.                 break;  
    12.             case android.R.id.home:  
    13.                 Toast.makeText(MainActivity.this,“touch up navigation”,Toast.LENGTH_SHORT).show();  
    14.                 AndroidUtils.backToParent(this); //返回上一级目录  
    15.                 break;  
    16.             defaultreturn super.onOptionsItemSelected(item);  
    17.         }  
    18.         return true;  
    19. }  
    20.     /** 
    21.      * 弹出共享菜单 
    22.      */  
    23.      public static void showPopupMenu(Context context,  
    24.                                      View v,int menuResId, PopupMenu.OnMenuItemClickListener onMenuItemClickListener,  
    25.                                      PopupMenu.OnDismissListener onDismissListener,int gravity){  
    26.         PopupMenu popup = new PopupMenu(context, v);  
    27.         MenuInflater inflater = popup.getMenuInflater();  
    28.         inflater.inflate(menuResId, popup.getMenu());  
    29.         //利用反射显示图标  
    30.         try {  
    31.             Field field = popup.getClass().getDeclaredField(”mPopup”);  
    32.             field.setAccessible(true);  
    33.             MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popup);  
    34.             mHelper.setForceShowIcon(true);  
    35.         } catch (IllegalAccessException | NoSuchFieldException e) {  
    36.             e.printStackTrace();   }  
    37.         popup.setOnMenuItemClickListener(onMenuItemClickListener);  
    38.         if(onDismissListener!=null) popup.setOnDismissListener(onDismissListener);  
    39.         popup.setGravity(gravity);  
    40.         popup.show();  
    41.     }  
    42.     /** 
    43.      * 跳转到父Activity 
    44.      */  
    45.     public static void backToParent(Activity activity){  
    46.         Intent upIntent = NavUtils.getParentActivityIntent(activity);  
    47.         if(upIntent == null) {  
    48.             activity.finish();  
    49.             return;  
    50.         }  
    51.         if (NavUtils.shouldUpRecreateTask(activity, upIntent)) {  
    52.             // This activity is NOT part of this app’s task, so create a new task  
    53.             // when navigating up, with a synthesized back stack.  
    54.             TaskStackBuilder.create(activity)  
    55.                     // Add all of this activity’s parents to the back stack  
    56.                     .addNextIntentWithParentStack(upIntent)  
    57.                             // Navigate up to the closest parent  
    58.                     .startActivities();  
    59.         } else {  
    60.             // This activity is part of this app’s task, so simply  
    61.             // navigate up to the logical parent activity.  
    62.             NavUtils.navigateUpTo(activity, upIntent);  
    63.         }  
    64.     }  
    @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()){
                case R.id.menu_finder:
                    Toast.makeText(MainActivity.this,"touch finderItem",Toast.LENGTH_SHORT).show();
                    AndroidUtils.changeActivity(this,SearchActivity.class); //跳转到搜索页Activity
                    break;
                case R.id.menu_tool:
                    Toast.makeText(MainActivity.this,"touch toolItem",Toast.LENGTH_SHORT).show();
                    AndroidUtils.showPopupMenu(this,toolbar,R.menu.popmenu,new OnPopupMenuItemClickListener(this)); //弹出共享菜单
                    break;
                case android.R.id.home:
                    Toast.makeText(MainActivity.this,"touch up navigation",Toast.LENGTH_SHORT).show();
                    AndroidUtils.backToParent(this); //返回上一级目录
                    break;
                default: return super.onOptionsItemSelected(item);
            }
            return true;
    }
        /**
         * 弹出共享菜单
         */
         public static void showPopupMenu(Context context,
                                         View v,int menuResId, PopupMenu.OnMenuItemClickListener onMenuItemClickListener,
                                         PopupMenu.OnDismissListener onDismissListener,int gravity){
            PopupMenu popup = new PopupMenu(context, v);
            MenuInflater inflater = popup.getMenuInflater();
            inflater.inflate(menuResId, popup.getMenu());
            //利用反射显示图标
            try {
                Field field = popup.getClass().getDeclaredField("mPopup");
                field.setAccessible(true);
                MenuPopupHelper mHelper = (MenuPopupHelper) field.get(popup);
                mHelper.setForceShowIcon(true);
            } catch (IllegalAccessException | NoSuchFieldException e) {
                e.printStackTrace();   }
            popup.setOnMenuItemClickListener(onMenuItemClickListener);
            if(onDismissListener!=null) popup.setOnDismissListener(onDismissListener);
            popup.setGravity(gravity);
            popup.show();
        }
        /**
         * 跳转到父Activity
         */
        public static void backToParent(Activity activity){
            Intent upIntent = NavUtils.getParentActivityIntent(activity);
            if(upIntent == null) {
                activity.finish();
                return;
            }
            if (NavUtils.shouldUpRecreateTask(activity, upIntent)) {
                // This activity is NOT part of this app's task, so create a new task
                // when navigating up, with a synthesized back stack.
                TaskStackBuilder.create(activity)
                        // Add all of this activity's parents to the back stack
                        .addNextIntentWithParentStack(upIntent)
                                // Navigate up to the closest parent
                        .startActivities();
            } else {
                // This activity is part of this app's task, so simply
                // navigate up to the logical parent activity.
                NavUtils.navigateUpTo(activity, upIntent);
            }
        }
    注意:  NavUtils 类的静态方法navigateUpFromSameTask()的效果是:finishes当前Activity并start或者resume其父Activity,如果父Activity在任务的返回栈中,那么正常回退。注意该方法仅仅适用于当当前应用是当前任务的所有者时方可使用。如果当前应用不是当前任务的所有者时,需要建立一个新的返回栈,如果你Activity能够接受其它应用通过Intent开启你的Activity,那么就需要注意这样的处理,具体内容就是第三步的case android.R.id.home下面的内容。如果你期望回退到父Activity时,其还能保持原来的状态,那么父Activity可能需要设置启动方式为android:launchMode=”singleTop”。

     (补充)四、Fragment中使用ToolBar
    1. @Override  public void onCreate(Bundle savedInstanceState) {   
    2.     super.onCreate(savedInstanceState);  
    3.     // …  
    4.     setHasOptionsMenu(true);  
    5. }  
    6. @Override  public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {   
    7.     // Inflate the menu; this adds items to the action bar.  
    8.     inflater.inflate(R.menu.my_menu, menu);    
    9.     // …  
    10. }  
    11. @Override  public boolean onOptionsItemSelected(MenuItem item) {   
    12.    // handle item selection  
    13.    switch (item.getItemId()) {  
    14.       case R.id.my_item:  
    15.          // Handle this selection  
    16.          return true;  
    17.       default:  
    18.          return super.onOptionsItemSelected(item);  
    19.    }  
    20. }  
    @Override  public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        // ...
        setHasOptionsMenu(true);
    }
    @Override  public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
        // Inflate the menu; this adds items to the action bar.
        inflater.inflate(R.menu.my_menu, menu);  
        // ...
    }
    @Override  public boolean onOptionsItemSelected(MenuItem item) { 
       // handle item selection
       switch (item.getItemId()) {
          case R.id.my_item:
             // Handle this selection
             return true;
          default:
             return super.onOptionsItemSelected(item);
       }
    }
    可以发现Fragment除了第一步之外其它都是和Activity类似的。

    (补充)五、ToolBar的Style设定
    ToolBar的构造器中有如下一行语句:
    final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), null,   R.styleable.Toolbar, R.attr.toolbarStyle, 0);方法底层会调用 TypedArray array = context.obtainStyledAttributes(null,   R.styleable.Toolbar, R.attr.toolbarStyle, 0);即从主题中定义的toolbarStyle样式文件中和主题直接定义的属性中获取到如下属性:
    1. <declare-styleable name=“Toolbar”>  
    2.     <attr format=“reference” name=“titleTextAppearance”/>  
    3.     <attr format=“reference” name=“subtitleTextAppearance”/>  
    4.     <attr name=“title”/>  
    5.     <attr name=“subtitle”/>  
    6.     <attr name=“android:gravity”/>  
    7.     <attr format=“dimension” name=“titleMargins”/>  
    8.     <attr format=“dimension” name=“titleMarginStart”/>  
    9.     <attr format=“dimension” name=“titleMarginEnd”/>  
    10.     <attr format=“dimension” name=“titleMarginTop”/>  
    11.     <attr format=“dimension” name=“titleMarginBottom”/>  
    12.     <attr name=“contentInsetStart”/>  
    13.     <attr name=“contentInsetEnd”/>  
    14.     <attr name=“contentInsetLeft”/>  
    15.     <attr name=“contentInsetRight”/>  
    16.     <attr format=“dimension” name=“maxButtonHeight”/>  
    17.     <attr format=“reference” name=“collapseIcon”/>  
    18.     <attr format=“string” name=“collapseContentDescription”/>  
    19.     <attr name=“Theme”/> <!–这里可以修改ToolBar除了PopupMenu的所有信息(如背景色:注意java代码中的setBackgroundColor这个方法不要用存在bug!!!效果不好,使用这里的background属性进行设置) 设置的值可以参考主题ThemeOverlay.AppCompat.Dark.ActionBar–>  
    20.     <attr name=“popupTheme”/>  <!–这里只能修改由ToolBar创建的弹出菜单,而对于自己通过创建PopupMenu对象显示的只能通过对context设置对应的主题进行设置,设置的值可以参考ThemeOverlay.AppCompat.Light–>  
    21.     <attr format=“reference” name=“navigationIcon”/>  
    22.     <attr format=“string” name=“navigationContentDescription”/>  
    23.     <attr name=“android:minHeight”/>  
    24.     <attr name=“logo”/>  
    25.     <attr format=“string” name=“logoDescription”/>  
    26.     <attr format=“color” name=“titleTextColor”/>  
    27.     <attr format=“color” name=“subtitleTextColor”/>  
    28. </declare-styleable>  
    <declare-styleable name="Toolbar">
        <attr format="reference" name="titleTextAppearance"/>
        <attr format="reference" name="subtitleTextAppearance"/>
        <attr name="title"/>
        <attr name="subtitle"/>
        <attr name="android:gravity"/>
        <attr format="dimension" name="titleMargins"/>
        <attr format="dimension" name="titleMarginStart"/>
        <attr format="dimension" name="titleMarginEnd"/>
        <attr format="dimension" name="titleMarginTop"/>
        <attr format="dimension" name="titleMarginBottom"/>
        <attr name="contentInsetStart"/>
        <attr name="contentInsetEnd"/>
        <attr name="contentInsetLeft"/>
        <attr name="contentInsetRight"/>
        <attr format="dimension" name="maxButtonHeight"/>
        <attr format="reference" name="collapseIcon"/>
        <attr format="string" name="collapseContentDescription"/>
        <attr name="Theme"/> <!--这里可以修改ToolBar除了PopupMenu的所有信息(如背景色:注意java代码中的setBackgroundColor这个方法不要用存在bug!!!效果不好,使用这里的background属性进行设置) 设置的值可以参考主题ThemeOverlay.AppCompat.Dark.ActionBar-->
        <attr name="popupTheme"/>  <!--这里只能修改由ToolBar创建的弹出菜单,而对于自己通过创建PopupMenu对象显示的只能通过对context设置对应的主题进行设置,设置的值可以参考ThemeOverlay.AppCompat.Light-->
        <attr format="reference" name="navigationIcon"/>
        <attr format="string" name="navigationContentDescription"/>
        <attr name="android:minHeight"/>
        <attr name="logo"/>
        <attr format="string" name="logoDescription"/>
        <attr format="color" name="titleTextColor"/>
        <attr format="color" name="subtitleTextColor"/>
    </declare-styleable>


    深入分析:

    public class Toolbar extends ViewGroup
    Toolbar()@Toolbar.class
    1. public Toolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {  
    2.         super(context, attrs, defStyleAttr);  
    3.         // Need to use getContext() here so that we use the themed context  
    4.         final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,  R.styleable.Toolbar, defStyleAttr, 0);   
    5.         mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0);  
    6.         ……//get操作  
    7.         final CharSequence title = a.getText(R.styleable.Toolbar_title);  
    8.         if (!TextUtils.isEmpty(title)) {  
    9.             setTitle(title);  
    10.         }  
    11.   
    12.         final CharSequence subtitle = a.getText(R.styleable.Toolbar_subtitle);  
    13.         if (!TextUtils.isEmpty(subtitle)) {  
    14.             setSubtitle(subtitle);  
    15.         }  
    16.         …..//set操作  
    17. }  
    public Toolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            // Need to use getContext() here so that we use the themed context
            final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,  R.styleable.Toolbar, defStyleAttr, 0); 
            mTitleTextAppearance = a.getResourceId(R.styleable.Toolbar_titleTextAppearance, 0);
            ......//get操作
            final CharSequence title = a.getText(R.styleable.Toolbar_title);
            if (!TextUtils.isEmpty(title)) {
                setTitle(title);
            }
    
            final CharSequence subtitle = a.getText(R.styleable.Toolbar_subtitle);
            if (!TextUtils.isEmpty(subtitle)) {
                setSubtitle(subtitle);
            }
            .....//set操作
    }
    构造器除了调用ViewGroup的构造器之外,还会获取当前View所属Context的主题相关的属性。

    onMeasure()@Toolbar.class
    1. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
    2.         int width = 0;  
    3.         int height = 0;  
    4.         int childState = 0;  
    5.         ………//note1  
    6.         final int measuredWidth = ViewCompat.resolveSizeAndState(  
    7.                 Math.max(width, getSuggestedMinimumWidth()),  
    8.                 widthMeasureSpec, childState & ViewCompat.MEASURED_STATE_MASK);  
    9.         final int measuredHeight = ViewCompat.resolveSizeAndState(  
    10.                 Math.max(height, getSuggestedMinimumHeight()),  
    11.                 heightMeasureSpec, childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT);  
    12.   
    13.         setMeasuredDimension(measuredWidth, shouldCollapse() ? 0 : measuredHeight);  
    14. }  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int width = 0;
            int height = 0;
            int childState = 0;
            .........//note1
            final int measuredWidth = ViewCompat.resolveSizeAndState(
                    Math.max(width, getSuggestedMinimumWidth()),
                    widthMeasureSpec, childState & ViewCompat.MEASURED_STATE_MASK);
            final int measuredHeight = ViewCompat.resolveSizeAndState(
                    Math.max(height, getSuggestedMinimumHeight()),
                    heightMeasureSpec, childState << ViewCompat.MEASURED_HEIGHT_STATE_SHIFT);
    
            setMeasuredDimension(measuredWidth, shouldCollapse() ? 0 : measuredHeight);
    }

    1、根据Toolbar中子View设置当前Toolbar显示 高度宽度。
    onLayout()@Toolbar.class
    1. protected void onLayout(boolean changed, int l, int t, int r, int b) {  
    2.         final boolean isRtl =  ViewCompat.getLayoutDirection(this) ==  ViewCompat.LAYOUT_DIRECTION_RTL;  
    3.         //Horizontal layout direction of this view is from Right to Left.  
    4.         final int width = getWidth();  
    5.         final int height = getHeight();  
    6.         final int paddingLeft = getPaddingLeft();  
    7.         final int paddingRight = getPaddingRight();  
    8.         final int paddingTop = getPaddingTop();  
    9.         final int paddingBottom = getPaddingBottom();  
    10.         int left = paddingLeft;  
    11.         int right = width - paddingRight;  
    12.         ….  
    13.         if (shouldLayout(mNavButtonView)) {….}  
    14.         if (shouldLayout(mCollapseButtonView)) {….}  
    15.         if (shouldLayout(mMenuView)) {….}  
    16.         ….  
    17.           
    18.        addCustomViewsWithGravity(mTempViews, Gravity.LEFT);  
    19.         //ArrayList<View> mTempViews = new ArrayList<View>();  
    20.         final int leftViewsCount = mTempViews.size();  
    21.         for (int i = 0; i < leftViewsCount; i++) {  
    22.             left = layoutChildLeft(mTempViews.get(i), left, collapsingMargins,  
    23.                     alignmentHeight);  
    24.         }  
    25.   
    26.         addCustomViewsWithGravity(mTempViews, Gravity.RIGHT);{…… }   
    27.         addCustomViewsWithGravity(mTempViews, Gravity.CENTER_HORIZONTAL);{…… }   
    28.         mTempViews.clear();  
    29. }  
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
            final boolean isRtl =  ViewCompat.getLayoutDirection(this) ==  ViewCompat.LAYOUT_DIRECTION_RTL;
            //Horizontal layout direction of this view is from Right to Left.
            final int width = getWidth();
            final int height = getHeight();
            final int paddingLeft = getPaddingLeft();
            final int paddingRight = getPaddingRight();
            final int paddingTop = getPaddingTop();
            final int paddingBottom = getPaddingBottom();
            int left = paddingLeft;
            int right = width - paddingRight;
            ....
            if (shouldLayout(mNavButtonView)) {....}
            if (shouldLayout(mCollapseButtonView)) {....}
            if (shouldLayout(mMenuView)) {....}
            ....
    
           addCustomViewsWithGravity(mTempViews, Gravity.LEFT);
            //ArrayList<View> mTempViews = new ArrayList<View>();
            final int leftViewsCount = mTempViews.size();
            for (int i = 0; i < leftViewsCount; i++) {
                left = layoutChildLeft(mTempViews.get(i), left, collapsingMargins,
                        alignmentHeight);
            }
    
            addCustomViewsWithGravity(mTempViews, Gravity.RIGHT);{...... } 
            addCustomViewsWithGravity(mTempViews, Gravity.CENTER_HORIZONTAL);{...... } 
            mTempViews.clear();
    }
    方法先对Toolbar中的导航栏、菜单栏、logo和标题等ActionBar中的属性进行布局。最后才给自己的childView进行布局。










    展开全文
  • Toolbar使用与自定义Toolbar

    千次阅读 2018-06-23 13:50:54
    Toolbar基本使用: 1.布局文件 <android.support.v7.widget.Toolbar  android:id="@+id/toolbar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:background="@color/...

    首先,去除标题栏:

    styly.xml中加两行代码去除标题栏

    <resources>
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <item name="windowActionBar">false</item>
            <item name="windowNoTitle">true</item>
        </style>
    </resources>


    Toolbar基本使用:


    1.布局文件
    <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimary"
            app:title="大标题"
            app:subtitle="小标题"
            app:navigationIcon="@drawable/ic_arrow_back"/>
    2.activity文件
    toolbar=findViewById(R.id.toolbar);
            toolbar.inflateMenu(R.menu.toolbar_menu);  //加载菜单栏
            toolbar.setNavigationOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(MainActivity.this,"clicked back",Toast.LENGTH_SHORT).show();


                }
            });
            toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    switch (item.getItemId()){
                        case R.id.menu_save:
                            Toast.makeText(MainActivity.this,"clicked save",Toast.LENGTH_SHORT).show();
                            break;
                        case R.id.menu_setting:
                            Toast.makeText(MainActivity.this,"clicked seting",Toast.LENGTH_SHORT).show();
                            break;
                    }
                    return false;
                }
            });
    3.menu文件
    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/menu_save"
            android:orderInCategory="100"
            android:title="Save"
            app:showAsAction="ifRoom"/>
        <!--
            这个属性可接受的值有:
            1、always:使菜单项一直显示在ToolBar上。
            2、ifRoom:如果有足够的空间,这个值会使菜单项显示在ToolBar上。
            3、never:使菜单项永远都不出现在ToolBar上,在…的子项中显示。
            4、withText:使菜单项和它的图标,菜单文本一起显示。
        -->
        <item
            android:id="@+id/menu_setting"
            android:enabled="true"
            android:orderInCategory="100"
            android:title="Setting"
            android:visible="true" />

    </menu>

    效果如下:



    下面是本篇第二部分内容,也是重点掌握部分。

    自定义Toolbar

    这里只做了基本功能实现,可能还不太美观,目标实现如下效果:



    看似两个布局,实际是一个布局文件,先用控件的visibility="gone"属性实现隐藏,需要控件时让其显示。

    这样就实现了一个应用只用一个toolbar。你可能觉得有些地方利用toolbar控件的自身属就能实现了(右侧加号),这里主要是教你自定义控件的方法。

    1.首先自定义toolbar布局文件toolbar.xml如下:

    
    
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <EditText
            android:id="@+id/toolbar_searchView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:layout_centerVertical="true"
            android:drawableLeft="@android:drawable/ic_menu_search"
            android:hint="请输入搜索内容"
            android:layout_marginRight="60dp"
            android:maxLines="1"
            android:visibility="gone"/>
        <TextView
            android:id="@+id/toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:layout_centerHorizontal="true"
            android:textColor="@android:color/white"
            android:textSize="20sp"
            android:visibility="gone"/>
        <ImageButton
            android:id="@+id/toolbar_rightButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:visibility="gone"
            style="@android:style/Widget.Toolbar.Button.Navigation"/>
    
    </RelativeLayout>

    2.其次自定义SwToolbar继承自Toolbar

    重写构造方法

    
    
    public SwToolbar(Context context) {
        this(context,null);
    }
    
    public SwToolbar(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs,0);
    }
    
    public SwToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
    
    
        //后续具体功能实现代码都写下这里面,
    
    
        //因为一个参数的构造方法调用两个参数的构造方法,两个参数的调用三个参数的构造方法,
    //所以具体实现要写在这里
    }
    初始化view

    
    
    private void initView() {
        if (view==null) {
            mInflater = LayoutInflater.from(getContext());
            view = mInflater.inflate(R.layout.toolbar, null);
    
            mTextTitle = view.findViewById(R.id.toolbar_title);
            mSearchView = view.findViewById(R.id.toolbar_searchView);
            mRightImageButton = view.findViewById(R.id.toolbar_rightButton);
    
            LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.CENTER_HORIZONTAL);
            //如果没有这行代码,title不会居中显示
    
            addView(view,layoutParams);
        }
    }

    标题和搜索框的显示与隐藏、

    public void  showSearchView(){
        if (mSearchView!=null){
            mSearchView.setVisibility(VISIBLE);
        }
    }
    public void  hideSearchView(){
        if (mSearchView!=null){
            mSearchView.setVisibility(GONE);
        }
    }
    public void  showTitleView(){
        if (mTextTitle!=null){
            mTextTitle.setVisibility(VISIBLE);
        }
    }
    public void  hideTitleView(){
        if (mTextTitle!=null){
            mTextTitle.setVisibility(GONE);
        }
    }

    重写setTitle方法

    @Override
    public void setTitle(int resId) {
        setTitle(getContext().getText(resId));
    }
    
    @Override
    public void setTitle(CharSequence title) {
        initView();
        if (mTextTitle!=null){
            mTextTitle.setText(title);
            showTitleView();
        }
    }
    通过以上条件,就可以实现如下界面了
    <com.baiseng.zl.swmonkmall.widget.SwToolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:title="主页"
        />
    
    


    下面介绍通过标签属性设置:搜索栏是否可见、右侧按钮图片


    <com.baiseng.zl.swmonkmall.widget.SwToolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:title="主页"
        app:rightButtonIcon="@android:drawable/ic_menu_add"/>

    <com.baiseng.zl.swmonkmall.widget.SwToolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:isShowSearchView="true"/>

    
    
    
    
    那么是如何通过添加一行属性实现的呢?

    首先,创建属性配置文件attrs.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="SwToolbar">
            <attr name="rightButtonIcon" format="reference"/>
            <attr name="isShowSearchView" format="boolean"/>
        </declare-styleable>
    </resources>
            <!--
                关于format取值,只介绍常用:
                1. reference:参考某一资源ID
                2. color:颜色值。
                3. string:字符串。
                4. boolean:布尔值。
                5. dimension:尺寸值。
            -->

    然后在自定义的toolbar中添加如下:

    (你可能不太理解为何这样写,按住Ctrl键,鼠标点击super(context, attrs, defStyleAttr);,查看他的源码

    public SwToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        if (attrs!=null){
            final TintTypedArray a = TintTypedArray.obtainStyledAttributes(getContext(), attrs,
                    R.styleable.SwToolbar, defStyleAttr, 0);
    
            final Drawable rightIcon = a.getDrawable(R.styleable.SwToolbar_rightButtonIcon);
            if (rightIcon != null            
            ) {
                setRightButtonIcon(rightIcon);
            }
            boolean isShowSearchView=a.getBoolean(R.styleable.SwToolbar_isShowSearchView,false);
            if (isShowSearchView){
                showSearchView();
                hideTitleView();
            }
    
            a.recycle();
        }
    
    
    }
    public void setRightButtonIcon(Drawable icon) {
        if (mRightImageButton!=null){
            mRightImageButton.setImageDrawable(icon);
            mRightImageButton.setVisibility(VISIBLE);
        }
    }

    通过以上就可以实现两种Toolbar布局。



    现在再为右侧ImageButton添加点击监听:

    public void setRightButtonOnClickner(OnClickListener listener){
        mRightImageButton.setOnClickListener(listener);
    }

    这样,就可以在MainActivity中直接调用了

    toolbar.setRightButtonOnClickner(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this,"click rightButton",Toast.LENGTH_SHORT).show();
        }
    });



    
    

    展开全文
  • Android ToolBar使用详解及示例源码

    千次阅读 2017-11-10 13:30:16
    市面上很多App使用ToolBar进行导航栏创建。ToolBar实际上是一个ViewGroup,可以包含任何的子View。用户可以根据自己的产品需求设计不同的导航栏。下图就是知乎和今日头条的导航栏,风格和内容迥异。
    一、ToolBar简介 源码地址
    ToolBar是google新推出的导航控件,用于取代ActionBar,包含在5.0版本中,对于低版本可以引人supportv7包进行调用。市面上很多App使用ToolBar进行导航栏创建。ToolBar实际上是一个ViewGroup,可以包含任何的子View。用户可以根据自己的产品需求设计不同的导航栏。下图就是知乎和今日头条的导航栏,风格和内容迥异。


    二、ToolBar的基本使用
    1、在布局文件中引入ToolBar
    为了测试效果,我们在ToolBar中添加了一个TextView,效果和代码如下:



    < android.support.v7.widget.Toolbar
    android :id= "@+id/toolbar"
    android :layout_width= "match_parent"
    android :layout_height= "wrap_content"
    android :background= "?attr/colorPrimary"
    android :minHeight= "?attr/actionBarSize"
    android :theme= "?attr/actionBarTheme" >
    < TextView
    android :id= "@+id/top_title"
    android :layout_width= "match_parent"
    android :layout_height= "wrap_content"
    android :layout_marginBottom= "@dimen/activity_vertical_margin"
    android :layout_marginLeft= "@dimen/activity_horizontal_margin"
    android :layout_marginRight= "@dimen/activity_horizontal_margin"
    android :layout_marginTop= "@dimen/activity_vertical_margin"
    android :text= " @string/top_title " />
    </ android.support.v7.widget.Toolbar >

    < meta-data
    android :name= "android.support.PARENT_ACTIVITY"
    android :value= ".MainActivity" />
    <!-- meta tag and intent filter go into results activity -->
    < meta-data android :name= "android.app.searchable"
    android :resource= "@xml/searchable" />
    < intent-filter >
    < action android :name= "android.intent.action.SEARCH" />
    </ intent-filter >
    从上边的图我们可以看到有两个导航栏,一个是我们刚刚新加入的ToolBar,另一个系统默认的ActionBar,下边我们通过主题(theme)来隐藏掉ActionBar
    2、主题修改
    在通过Android studio新建工程时,会在styles.xml默认指定一个主题,该主题引入了ActionBar:
    < style name= "AppTheme" parent= "Theme.AppCompat.Light.DarkActionBar" >
    <!-- Customize your theme here. -->
    < item name= "colorPrimary" >@color/colorPrimary</ item >
    < item name= "colorPrimaryDark" >@color/colorPrimaryDark</ item >
    < item name= "colorAccent" >@color/colorAccent</ item >
    </ style >
    下边新引入一个主题隐藏掉ActionBar:
    < style name= "ThemeNoActionBar" parent= "Theme.AppCompat.Light.NoActionBar" >
    < item name= "colorPrimary" >@color/colorPrimary</ item >
    < item name= "colorPrimaryDark" >@color/colorPrimaryDark</ item >
    < item name= "colorAccent" >@color/colorAccent</ item >
    </ style >
    对ToolBar的颜色控制是通过主题中colorPrimary、colorPrimaryDark等来控制的,具体作用的区域可以通过下图形象认识。


    3、为ToolBar添加Title、图标等
    在MainActivity先获取ToolBar实例,然后通过类库提供的Api进行操作。

    toolbar =(Toolbar)findViewById(R.id. toolbar );
    toolbar .setTitle( "Menu" );
    toolbar .setSubtitle( "SubMenu" );
    toolbar .setNavigationIcon(R.drawable. ic_dashboard_black_24dp );
    setSupportActionBar( toolbar );

    三、为ToolBar添加菜单
    1、添加菜单资源
    在menu目录下,添加menu_main.xml文件,并在文件中添加菜单项
    < item android :id= "@+id/action_search"
    android :title= "Search"
    android :icon= "@drawable/ic_notifications_black_24dp"
    app :showAsAction= "ifRoom" />
    < item android :id= "@+id/action_notifications"
    android :title= "notifications"
    android :icon= "@drawable/ic_dashboard_black_24dp"
    app :showAsAction= "ifRoom" />
    < item android :id= "@+id/action_settings"
    android :title= "@string/app_name"
    android :orderInCategory= "100"
    android :icon= "@mipmap/ic_launcher"
    app :showAsAction= "never" />
    这里对app:showAsAction和android:showAsAction进行下说明,很多网友不知道他们的区别。app:showAsAction对于的Activity是继承自 AppCompatActivity ; android:showAsAction则是继承自Activity
    具体 .always、never参数是指菜单在ToolBar上的位置,具体 说明:
    app:showAsAction
    1.always:总是显示在界面上
    2.never:不显示在界面上,只让出现在右边的三个点中
    3.ifRoom:如果有位置才显示,不然就出现在右边的三个点中  
    android:showAsAction
    1.alaways:这个值会使菜单项一直显示在ActionBar上。
    2.ifRoom:如果有足够的空间,这个值会使菜单显示在ActionBar上。
    3.never:这个值菜单永远不会出现在ActionBar是。
    4.withText:这个值使菜单和它的图标,菜单文本一起显示。

    把菜单添加ToolBar里,是通过 重写 onCreateOptionsMenu方法来实现:
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu. menu_main , menu);
    return true ;
    }

    2、菜单点击事件
    点击事件是在OnCreate方法中设置监听事件,代码:
    toolbar .setOnMenuItemClickListener( new Toolbar.OnMenuItemClickListener() {
    @Override
    public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
    case R.id. action_search :
    Toast. makeText (MainActivity. this , "案秀云 !" , Toast. LENGTH_SHORT ).show();
    break ;
    case R.id. action_notifications :
    Toast. makeText (MainActivity. this , "IT知识库 !" , Toast. LENGTH_SHORT ).show();
    break ;
    case R.id. action_settings :
    Toast. makeText (MainActivity. this , "方案库 !" , Toast. LENGTH_SHORT ).show();
    break ;
    }
    return true ;
    }
    });




    展开全文
  • Toolbar使用例子

    2016-08-10 17:06:07
    该项目简明扼要地介绍了toolbar的用法,其中内容包括如何让toolbar标题居中,修改toolbar返回按钮的图标,不显示系统默认标题等等。
  • 简介 Django Debug Toolbar是Django开发中...本篇将详细讲解如何django-debug-toolbar使用。 项目集成Django Debug Toolba 我们去Django Debug Toolba官网,跟随官方文档一起学习 Django Debug Toolba官方文档...
  • toolbar使用踩过的坑(注意点)

    千次阅读 2017-09-05 17:01:54
    该方法是与setSupportActionBar(ToolBar toolbar)冲突的,所以如果我们想使用inflatede(@MenuRes int resId)方法的话,可以不使用setSuooprtActionBar(ToolBar toolbar)方法2:使用setTitle(String title) ...
  • Android Studio精彩案例(七)《ToolBar使用详解<一>》

    万次阅读 多人点赞 2017-01-13 18:31:15
    转载本专栏文章,请注明出处,...上一篇博客我们学习了ActionBar的使用,因为以前很多方式都会对ActionBar做深度定制,使用起来不是很方便,toolbar 作为 android 5.0 引入的一个新控件,可以理解为是ActionBar的升级版
  • 前言 在 2014 年 Google IO 大会上,Google 推出了一套全新的设计规范 Material Design,这也为广大的 Android 开发者带来了福音,...由于 APP 改版在做 Material Design 化,所以后面会结合项目中的使用情况写几篇关
  • VB toolbar使用

    2012-09-13 16:06:12
    vb toolbar使用教程~!能够更容易上手,对初学者很有用~
  • 使用Toolbar会变成全屏,明明高度已经设置成?attr/actionBarSize了 顺便求大佬告诉下toolbar的图标都是怎么弄得啊 例如导航栏 后退键 android:layout_height="match_parent" xmlns:android=...
  • Toolbar使用方法

    千次阅读 2016-02-28 22:46:04
    Toolbar
  • 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. ...并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为ActionBar使用时需要注意的事项. 使用support library的Toolbar Android的Actio
  • Android--ToolBar使用

    千次阅读 2018-07-13 11:07:39
    使用ToolBar 使用的文件: 1、MainActivity.java 2、activity_main.xml 3、style.xml 4、menu_main.xml 1、基本设置 style中配置 &amp;amp;amp;amp;lt;!-- Base application theme. --&amp;amp;...
  • Android ToolBar使用详解(手把手教你撸代码)

    千次阅读 热门讨论 2021-03-24 14:51:04
    这几天因为偶然看到关于Android 11分区存储的变更,然后博客就耽误了,以前关于toolbar了解过但是没有上手过,因为没有负责到那一块,今天我们来手撸一下关于toolbar的代码以及我遇到的问题,我会给大家一一写清楚,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 128,241
精华内容 51,296
关键字:

toolbar使用