GVKun编程网logo

什么是AppBar vs ToolBar?(什么是suv汽车)

24

对于什么是AppBarvsToolBar?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍什么是suv汽车,并为您提供关于ActionBar和新引入的Toolbar有什么区别?、androida

对于什么是AppBar vs ToolBar?感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍什么是suv汽车,并为您提供关于Action Bar 和新引入的 Toolbar 有什么区别?、android acitonbar(toolbar)自定义溢出菜单样式、Android ActionBar和ToolBar的使用、android actionbar和toolbar的区别的有用信息。

本文目录一览:

什么是AppBar vs ToolBar?(什么是suv汽车)

什么是AppBar vs ToolBar?(什么是suv汽车)

所有material-ui示例均在Appbar中显示工具栏。为什么不只是Appbar?两者有什么区别?

https://material.io/design/components/并
没有 有工具栏组成部分,只有“应用吧:顶”。

https://material.io/develop/web/components/toolbar/表示“现有的MDCToolbar组件和样式将在将来的版本中删除”

那么material-ui工具栏最终会消失吗?

答案1

小编典典

我正在查看每个组件产生的默认CSS属性。 工具栏 的主要目的是通过内联显示(子元素彼此相邻)显示其子项,而 Appbar 则不行。所述
AppBar 部件用途 显示:柔性弯曲方向:柱 ,该装置直接后代被堆叠在彼此的顶部。另一方面, 工具栏也 使用
display:flex ,但未设置 flex-direction ,这意味着它使用其默认值: row 。就是说, Button
组件使用 display:inline-block 。这就是为什么在 工具栏 组件内将元素彼此相邻放置的原因。

让说,例如,我们有一个 Appbar工具栏 有两个 按钮 S作为孩子:

<AppBar>    <Toolbar>        <Button variant="outlined" color="inherit" >            Button 1        </Button>        <Button variant="outlined" color="inherit">            Button 2        </Button>    </Toolbar></AppBar>

此代码的结果显示 在此处

但是,如果我们删除 工具栏 并将 Button 放置在 AppBar 组件的正下方:

<AppBar>    <Button variant="outlined" color="inherit" >        Button 1    </Button>    <Button variant="outlined" color="inherit">        Button 2    </Button></AppBar>

其结果将是非常不同的(示出在这里),因为现在的按钮是直接后代的
AppBar 部件等,它们会在彼此的顶部堆叠。

如您所见, AppBarToolbar 具有不同的用途。这就是为什么我认为 工具栏 永远不会消失的原因。

Action Bar 和新引入的 Toolbar 有什么区别?

Action Bar 和新引入的 Toolbar 有什么区别?

在 Google 推出 Material Design 之后,我听说了一个名为 Toolbar 的新小部件类。

什么是 Toolbar,ActionBar 和 ToolBar 之间的确切区别是什么?

答案1

小编典典

我从Android Developers Blog post中找到了一个很好的解释。

在此版本中,Android 引入了一个新的工具栏小部件。 这是 Action Bar 模式的概括,它为您提供了更多的控制和灵活性。
工具栏是您的层次结构中的一个视图,就像任何其他视图一样,可以更轻松地与您的其余视图交错、对其进行
动画处理以及对滚动事件作出反应。您还可以将其设置为您的 Activity 的操作栏,这意味着您的标准选项菜单操作将显示在其中。

是的,我们,Android 开发者,需要更多的控制权ActionBar,对吧?并且Toolbar只是为了它。

也就是说,ActionBar现在变成了一种特殊的Toolbar。这是谷歌官方材料设计规范文档的摘录。

应用栏,以前称为 Android 中的操作栏,是一种特殊的工具栏,用于品牌、导航、搜索和操作。

上面的博客文章中包含更多详细信息,例如如何Toolbar用作 an 。ActionBar

android acitonbar(toolbar)自定义溢出菜单样式

android acitonbar(toolbar)自定义溢出菜单样式

样例

##定义样式

  
 <!--溢出菜单样式 -->
 <style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow">
   <item name="overlapAnchor">false</item>
   <item name="android:dropDownWidth">wrap_content</item>
   <item name="android:paddingRight">5dp</item>
   <item name="android:popupBackground">?attr/colorPrimary</item>
   <item name="android:dropDownVerticalOffset">4dip</item>
   <item name="android:dropDownHorizontalOffset">0dip</item>
 </style>

dropDownHorizontalOffset:指定下拉菜单与文本之间的水平间距;

dropDownVerticalOffset:同上,不过这个是竖直方向的偏移,这里的话我们设置为4dp,默认值这里是-4dp;

dropDownHeight/Width:分别是指定下拉菜单的高度与宽度

popupBackground:为下拉菜单提供一个背景

##在自己的activity样式中加入

    <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>

Android ActionBar和ToolBar的使用

Android ActionBar和ToolBar的使用

参考

1、android中的ActionBar和ToolBar
2、『Material Design入门学习笔记』主题与AppCompatActivity(附demo)
3、Android开发:最详细的 Toolbar 开发实践总结
4、Toolbar设置详解----掉坑总结

前言

自android5.0开始,AppCompatActivity代替ActionBarActivity,而且ToolBar也代替了ActionBar,下面就是ActionBar和ToolBar的使用

ActionBar

1、截图

image.png

2、使用

2.1、AppCompatActivity和其对应的Theme

  • AppCompatActivity使用的是v7的ActionBar(和默认的ActionBar使用起来略有区别,一会代码中会有体现)
  • Theme的话继承于Theme.AppCompat.Light.DarkActionBar,系统提供的深色系的actionbar,那么按钮,文字,和菜单是白色的
//Activity
public class ActionBarActivity extends AppCompatActivity

//style
<!--默认所有activity的actionbar的theme-->
    <style name="AppCompatActivity_ActionBarTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>

2.2、ActionBar的使用

  • 获取actionbar:\color{red}{这里v7的是getSupportActionBar(),默认的是getActionBar()}
        //AppCompatActivity use v7 action bar
        actionBar = this.getSupportActionBar();
        //Activity use action bar
        //actionBar = this.getActionBar();

        if(actionBar == null){
            return;
        }
  • 设置主副标题
        //主标题
        actionBar.setTitle("ActionBar Title");
        //副标题
        actionBar.setSubtitle("Sub Title");
  • 设置navigation up按钮:可见+可用+更换图标
        //左侧按钮:可见+可用+更换图标
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        //actionBar.setHomeAsUpIndicator(R.mipmap.back_white);
  • 设置navigation up按钮的监听:复写onSupportNavigateUp(),\color{red}{但是如果有menu复写onOptionsItemSelected函数的话,则onSupportNavigateUp()将不会被调用}
/**
     * 复写:左侧按钮点击动作
     * android.R.id.home
     * v7 actionbar back event
     * 注意:如果复写了onOptionsItemSelected方法,则onSupportNavigateUp无用
     * */
    @Override
    public boolean onSupportNavigateUp() {
        finish();
        return super.onSupportNavigateUp();
    }

    /**
     * 复写:左侧按钮点击动作
     * android.R.id.home
     * actionbar back event
     * 注意:如果复写了onOptionsItemSelected方法,则onSupportNavigateUp无用
    @Override
    public boolean onNavigateUp() {
        finish();
        return super.onNavigateUp();
    }* */
  • 设置logo(icon等):用logo代替icon,不知道为什么不灵??
        //设置logo
        actionBar.setLogo(android.R.mipmap.sym_def_app_icon);
        actionBar.setDisplayUseLogoEnabled(true);
        //设置icon:use logo instead of an icon
        //actionBar.setIcon(R.mipmap.ic_launcher);
  • 设置菜单menu和对应监听:android.R.id.home就是左侧的navigation up按钮
   /**
     * 复写:添加菜单布局
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * 复写:设置菜单监听
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                //actionbar navigation up 按钮
            case android.R.id.home:
                finish();
                break;

            case R.id.action_refresh:
                Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_add:
                Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
  • 设置tab和对应监听
        //增加actionbar 下面的tab按钮
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
                Toast.makeText(ActionBarActivity.this, "Tab 1 select",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
        }));
        actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
                Toast.makeText(ActionBarActivity.this, "Tab 2 select",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
        }));
  • 或者完全自定义
       //自定义
        actionBar.setCustomView(R.layout.actionbar_title);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
  • 隐藏、显示actionbar
case R.id.btn_hide:
                if(actionBar != null){
                    /**
                     * 隐藏actionbar
                     * 1、有actionbar情况下:actionBar.hide();
                     * 2、直接使用Theme.Holo.NoActionBar
                     * 3、theme中添加属性
                     *      <item name="windowActionBar">false</item>
                     *      <item name="windowNoTitle">true</item>
                     * 4、在setContent之前 Window feature must be requested before adding content
                     *    AppCompatActivity: supportRequestWindowFeature(Window.FEATURE_NO_TITLE),
                     *    Activity: requestWindowFeature(Window.FEATURE_NO_TITLE);
                     *
                     * */
                    actionBar.hide();
                }
                break;

            case R.id.btn_show:
                if(actionBar != null){
                    actionBar.show();
                }
                break;

-------------------------------------分割线-------------------------------

Menu(共通的菜单,不细说)

1、showAsAction属性

  • always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示
  • ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中
  • never则表示永远显示在overflow中
  • withText:这个值使菜单项和它的图标,文本一起显示

2、布局

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!--showAsAction属性
        always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示
        ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中
        never则表示永远显示在overflow中
        withText:这个值使菜单项和它的图标,文本一起显示-->

    <!--menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。-->

    <!--orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值-->

    <item
        android:id="@+id/action_refresh"
        android:icon="@mipmap/refresh"
        android:title="Refresh"
        app:showAsAction="always" />
    <item
        android:id="@+id/action_add"
        android:icon="@mipmap/add"
        android:title="Add"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_settings"
        android:icon="@mipmap/settings"
        android:title="Settings"
        app:showAsAction="never">
    </item>
</menu>

-------------------------------------分割线-------------------------------

ToolBar

了解了ActionBar的话,那么ToolBar和其差不多,更加强大,更加符合MD风格,然后就代替ActionBar,使用起来差不多,但是又UI上的坑

1、截图:颜色不正常的

image.png

2、使用

2.1、隐藏ActionBar有4中方式

  • 1、如果继承了theme有actionbar的则,在setContentView方法之前设置:v7的supportRequestWindowFeature(Window.FEATURE_NO_TITLE);或者非v7的requestWindowFeature(Window.FEATURE_NO_TITLE);
  • 2、theme直接继承没有actionbar的,比如说:Theme.AppCompat.Light.NoActionBar
  • 3、theme中没设置属性没有actionbar:<item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
  • 4、actionBar.hide();

2.2、AppCompatActivity和其对应的Theme

//activity
public class ToolBarActivity extends AppCompatActivity

//style
    <!--默认所有activity的toolbar的theme-->
    <!--<style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
    <style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light">
        <!--不要actionbar,不要title-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>

        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>

ToolBar的使用

  • toolbar在layout中布局代码:
    \color{red}{这里面有UI的坑,就是深色toolbar,文字也是黑色的,难看}
<!--这里是代替actionbar的,当然可以设置在baseactivity中通用,然后include进来-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize">

    </android.support.v7.widget.Toolbar>
  • 获取toolbar并取代actionbar,这里设置toolbar的标题必须在setSupportActionBar之前,否则无用
       //隐藏默认actionbar
        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.hide();
        }

        //获取toolbar
        toolBar = findViewById(R.id.toolbar);
        //主标题,必须在setSupportActionBar之前设置,否则无效,如果放在其他位置,则直接setTitle即可
        toolBar.setTitle("ToolBar Title");
        //用toolbar替换actionbar
        setSupportActionBar(toolBar);
  • 设置副标题
        //副标题+颜色
        toolBar.setSubtitle("Sub Title");
  • 设置navigation up按钮的图标和点击监听
        //左侧按钮:可见+更换图标+点击监听
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示toolbar的返回按钮
        //toolBar.setNavigationIcon(R.mipmap.back_white);
        toolBar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
       
  • 设置logo
         //设置logo
        toolBar.setLogo(android.R.mipmap.sym_def_app_icon); 
  • 设置菜单menu及其监听
/**
     * 复写:添加菜单布局
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * 复写:设置菜单监听
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_refresh:
                Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_add:
                Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
       
  • 加载自定义toolbar:直接在toolbar的layout中写即可,可以是文字居中等等
  • 隐藏、显示toolbar
 case R.id.btn_hide:
                if(toolBar != null){
                    toolBar.setVisibility(View.GONE);
                }
                break;

            case R.id.btn_show:
                if(toolBar != null){
                    toolBar.setVisibility(View.VISIBLE);
                }
                break;

3、截图:颜色正常的

4、用ToolBar 的Theme和PopupTheme来控制颜色正常,或自定义颜色

4.1、ToolBar显然颜色不对,那找找为啥ActionBar的时候对的,直觉告诉我是theme的问题,于是找Theme.AppCompat.Light.DarkActionBar,点击进去看会看到

  • actionBarPopupThem是Light的,就是menu菜单点击弹出那个
  • actionBarTheme是深色系的,那么控制按钮图标和主副标题颜色就是白色的
<style name="Base.Theme.AppCompat.Light.DarkActionBar" parent="Base.Theme.AppCompat.Light">
        <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
        <item name="actionBarWidgetTheme">@null</item>
        <item name="actionBarTheme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>

        <!-- Panel attributes -->
        <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>

        <item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
        <item name="colorPrimary">@color/primary_material_dark</item>
    </style>

4.2、新建Toolbar的theme和popuptheme:这里面就是继承刚刚找到的东西,当然也可以再自定义颜色咯

    <!--给toolbar单独设置的theme,让toolbar上按钮颜和文字颜色变化的-->
    <style name="MyDarkToolBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
        <!--toolbar图标颜色-->
        <!--<item name="colorControlNormal">@color/colorAccent</item>-->
        <!--toolbar的title颜色-->
        <!--<item name="android:textColorPrimary">@color/colorAccent</item>-->
        <!--toolbar的subtitle颜色-->
        <!--<item name="subtitleTextColor">@color/colorAccent</item>-->
    </style>

    <!--给toolbar的menu内单独设置的theme,让toolbar上按钮颜和文字颜色变化的-->
    <style name="MyLightPopupTheme" parent="ThemeOverlay.AppCompat.Light">
        <!--设置背景-->
        <!--<item name="android:background">@android:color/white</item>-->
        <!--设置字体颜色-->
        <!--<item name="android:textColor">@color/colorAccent</item>-->
        <!--设置不覆盖锚点-->
        <!--<item name="overlapAnchor">false</item>-->
    </style>

4.3、添加Toolbar的theme和popuptheme

//需添加
xmlns:app="http://schemas.android.com/apk/res-auto"

<!--这里是代替actionbar的,当然可以设置在baseactivity中通用,然后include进来-->
    <android.support.v7.widget.Toolbar
        省略...
        app:theme="@style/MyDarkToolBarTheme"
        app:popupTheme="@style/MyLightPopupTheme">

    </android.support.v7.widget.Toolbar>

大功告成

以上就是ActionBar和ToolBar的入门使用,后面配合上系统的StatusBar和NavigationBar,并实现沉浸式还有的烦,但这些都属于基础部分,得打牢UI基础。

友情链接>>> Android 沉浸式风格(为毛叫沉浸式这么唬人)



作者:Kandy_JS
链接:https://www.jianshu.com/p/81d0bcb282cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

android actionbar和toolbar的区别

android actionbar和toolbar的区别

ActionBar

ActionBar 是android 3.0的推出的,当时Google 想要逐渐改善过去 android 纷乱的界面设计,希望让终端使用者尽可能在 android 手机有个一致的操作体验。ActionBar 过去最多人使用的两大套件就是 ActionBarSherlock 以及官方提供在 support library v 7 里的 AppCompat。

Action bar被包含在所有的使用Theme.Hole主题的Activity(或者是这些Activity的子类)中。

删除actionbar

如果不想用ActionBar,那么只要在theme主题后面" .NoActionBar", 就可以了。

由于现在用的不多了,所以就一带而过了。

Toolbar

Toolbar 是android 5.0的推出的,放在了v7包中作为控件,它是为了取代actionbar而产生的,意味着官方在某些程度上认为 ActionBar 限制了 android app 的开发与设计的弹性,而在 material design 也对之做了名称的定义:App bar。

简单使用

布局

<android.support.v7.widget.Toolbar    
    android:id="@+id/toolbar"    
    android:layout_width="match_parent"    
    android:layout_height="?attr/actionBarSize"    
    android:background="?attr/colorPrimary"    
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"    
    app:layout_scrollFlags="scroll|enterAlways"/>

代码

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

setSupportActionBar 设定,Toolbar即能取代原本的 actionbar 了

截图说明一下:

toolbar.png

其他详细的使用,可以看推荐的下面文章, 已经写的很好了:

android:ToolBar详解(手把手教程)

来源
作者:666swb
链接:https://www.jianshu.com/p/733...
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关于什么是AppBar vs ToolBar?什么是suv汽车的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Action Bar 和新引入的 Toolbar 有什么区别?、android acitonbar(toolbar)自定义溢出菜单样式、Android ActionBar和ToolBar的使用、android actionbar和toolbar的区别的相关知识,请在本站寻找。

本文标签: