Android笔记系列--Actionbar和Toolbar使用

源码:

https://github.com/StarsAaron/ActionBarAndToolBarDemo/tree/master

内容:
(1)actionbar和menu使用
(2)toolbar和menu使用
(3)toolbar定义左上角导航按钮的点击事件

Tittlebar 只有APP图标和文字.不支持点击事件
Actionbar 在Android 3.0(API 11)中才加入
Toolbar 替代Actionbar

Actionbar 


  1. ActionBar的图标,可显示软件图标,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航;
  2. 如果你的应用要在不同的View中显示数据,这部分允许用户来切换视图。一般的作法是用一个下拉菜单或者是Tab选项卡。如果只有一个界面,那这里可以显示应用程序的标题或者是更长一点的商标信息;
  3. 两个action按钮,这里放重要的按钮功能,为用户进行某项操作提供直接的访问;
  4. overflow按钮,放不下的按钮会被置于“更多...”菜单项中,“更多...”菜单项是以下拉形式实现的

重写Activity的 onCreateOptionsMenu() 和 onOptionsItemSelected() 方法,初始化菜单和设置选中的操作。
从Android3.0(API级别 11)开始,Actionbar被包含在所有的使用Theme.Hole主题的Activity(或者是这些Activity的子类)中,当targetSdkVersion或minSdkVersion属性被设置为“11”或更大的数值是,这个主题是默认的主题一

actionbar图标导航
默认情况下,应用程序图标显示在操作栏的左边,你能够把这个图标当做操作项来使用。
从Android4.0(API 级别 14)开始,必须通过调用actionbar.setHomeButtonEnabled(true)方法确保这个图标能够作为一个操作项。
在以前的版本,默认情况下,这个图标就能够作为一个操作项。
在 onOptionsItemSelected()方法中,它的ID固定是 android.R.id.home


actionbar返回图标导航
actionbar返回图标导航在形式上就是在ActionBar图标(如果没有设置图标icon,文字标题也可以代替)的左侧添加了一个向左的箭头,通常情况下这都表示返回的意思

它的使用方法跟上面图标导航非常像
通过actionBar.setDisplayHomeAsUpEnabled(true); 在 onOptionsItemSelected()方法中,它的ID固定是 android.R.id.home

  1. actionBar.setDisplayShowHomeEnabled(true);使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标
  2. actionBar.setDisplayShowTitleEnabled(true) ;使左上角标题是否显示
  3. actionBar.setDisplayShowCustomEnabled(true);使自定义的普通View(比如输入框)能在title栏显示,即actionBar.setCustomView能起作用

例子:
<?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">

    <item
        android:id="@+id/user_p"
        android:icon="@mipmap/ic_launcher_round"
        android:title="用户"
        app:showAsAction="always"/>
    <item
        android:id="@+id/search"
        android:title="查找"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:actionViewClass="android.widget.SearchView"/>
    <item
        android:id="@+id/progress"
        android:title="时钟"
        android:orderInCategory="100"
        app:showAsAction="always"
        android:actionLayout="@layout/clock"/>
</menu>
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;

public class ActionBarTestActivity extends AppCompatActivity {
    private ActionBar actionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_action_bar_test);
        actionBar = getSupportActionBar();
        actionBar.setHomeButtonEnabled(true);//确保icon图标能够作为一个操作项被点击
        actionBar.setDisplayHomeAsUpEnabled(true);//在ActionBar图标(如果没有设置图标icon,文字标题也可以代替)的左侧添加了一个向左的箭头
        actionBar.setDisplayShowHomeEnabled(true);//使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标
        actionBar.setDisplayShowTitleEnabled(true);//使左上角标题是否显示
        actionBar.setDisplayShowCustomEnabled(true);//使自定义的普通View(比如输入框)能在title栏显示,即actionBar.setCustomView能起作用
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Toast.makeText(ActionBarTestActivity.this, "点击了:" + item.getItemId(), Toast.LENGTH_SHORT).show();
        switch (item.getItemId()) {
            case R.id.user_p:
                Toast.makeText(ActionBarTestActivity.this, "点击了:" + item.getItemId(), Toast.LENGTH_SHORT).show();
                break;
            case android.R.id.home://左上角图标点击动作
                Toast.makeText(ActionBarTestActivity.this, "点击了Home", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}


Toolbar 
可以用Toolbar替换掉actionbar,只需调用 Activity.setActionBar()
为了兼容更多的设备一般我们都是通过AppCompat 中的 android.support.v7.widget.Toolbar来使用Toolbar
<?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">
    <item
        android:id="@+id/user_p"
        android:icon="@mipmap/ic_launcher_round"
        android:title="用户"
        app:showAsAction="always"/>
    <item
          android:id="@+id/ab_search"
          android:orderInCategory="60"
          android:title="action_search"
          app:actionViewClass="android.support.v7.widget.SearchView"
          app:showAsAction="ifRoom"/>
</menu>
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;

public class ToolbarTestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_toolbar);
        
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setNavigationIcon(R.mipmap.ic_launcher_round);
        toolbar.inflateMenu(R.menu.menu_toolbar);
        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                Toast.makeText(ToolbarTestActivity.this, "点击了:" + item.getItemId(), Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        // 左边图标按钮
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}


注意:使用ToolBar  需要设置 NoActionBar主题,不然会报错,例如:  
给Activity 设置主题 android:theme="@style/AppTheme"
<style name="AppTheme2" parent="Theme.AppCompat.Light.NoActionBar">
   <!-- Customize your theme here. -->
   <item name="colorPrimary">@color/colorPrimary</item>
   <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
   <item name="colorAccent">@color/colorAccent</item>
</style>


另外一种方式使用原始绑menu方式,为左上角NavigationIcon图片添加点击判断。
public class ToolbarTest2Activity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_toolbar_test2);

        Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
        toolbar.setNavigationIcon(R.mipmap.ic_launcher_round);
        setSupportActionBar(toolbar);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_toolbar, menu);
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.ab_search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Toast.makeText(ToolbarTest2Activity.this, "点击了:" + item.getItemId(), Toast.LENGTH_SHORT).show();
        switch (item.getItemId()) {
            case R.id.user_p:
                Toast.makeText(ToolbarTest2Activity.this, "点击了:" + item.getItemId(), Toast.LENGTH_SHORT).show();
                break;
            case android.R.id.home://setNavigationIcon自定义的左上角图标点击动作ID为固定的android.R.id.home
                Toast.makeText(ToolbarTest2Activity.this, "点击了Home", Toast.LENGTH_SHORT).show();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

观察上面两种方式的差别,使用了setSupportActionBar 的Activity Toolbar 带有标题





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

繁星点点-

请我喝杯咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值