源码:
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
- ActionBar的图标,可显示软件图标,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航;
- 如果你的应用要在不同的View中显示数据,这部分允许用户来切换视图。一般的作法是用一个下拉菜单或者是Tab选项卡。如果只有一个界面,那这里可以显示应用程序的标题或者是更长一点的商标信息;
- 两个action按钮,这里放重要的按钮功能,为用户进行某项操作提供直接的访问;
- 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
- actionBar.setDisplayShowHomeEnabled(true);使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标
- actionBar.setDisplayShowTitleEnabled(true) ;使左上角标题是否显示
- 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 带有标题