前言
android的toolbar的返回键有必要存在吗?
google自家应用也保留了toolbar的返回键。 觉得和下方的实体返回键重了。
不管什么原因大众的使用习惯就是这样,
所以呢在开发过程中就会有了toolbar的返回和实体返回键都要实现的问题
而且要基本功能相同,这就有了功能同步的问题。
官方中把Toolbar中的那个返回键不叫做返回键 ,而叫做Up功能是返回该app的逻辑层级的上一层,即
parentActivity
。
详细见Navigation with Back and Up返回back stack的上一个activity。
实现
要想ActionBar或者toolbar显示出home来需要调用如下代码
//在onCreate()内部,通过setSupportActionBar()向Activity传递布局内Toolbar的引用
setSupportActionBar(toolbar);
//这里提示可能会报出异常具体见下图
getSupportActionBar().setHomeButtonEnabled(true);
//设置toolbar后调用setDisplayHomeAsUpEnabled
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
setHomeButtonEnabled
这个小于4.0版本的默认值为true的。但是在4.0及其以上是false,
该方法的作用:决定左上角的图标是否可以点击。没有向左的小图标。 true 图标可以点击 false 不可以点击。- setDisplayHomeAsUpEnabled(true)
给左上角图标的左边加上一个返回的图标 。对应ActionBar.DISPLAY_HOME_AS_UP
- setDisplayShowHomeEnabled(true)
使左上角图标是否显示,如果设成false,则没有程序图标,仅仅就个标题,否则,显示应用程序图标,对应id为android.R.id.home
,对应ActionBar.DISPLAY_SHOW_HOME
- setDisplayShowCustomEnabled(true)
使自定义的普通View能在title栏显示,即actionBar.setCustomView
能起作用,对应ActionBar.DISPLAY_SHOW_CUSTOM
- setDisplayShowTitleEnabled(true)
对应ActionBar.DISPLAY_SHOW_TITLE
其中
setHomeButtonEnabled
和setDisplayShowHomeEnabled
共同起作用,如果setHomeButtonEnabled
设成false
,即使setDisplayShowHomeEnabled
设成true
,图标也不能点击
接着配置AndroidManifest.xml
在Android 4.1上,只需要声明该activity的parentActivity
即可。
在Android 4.0及之前的版本上,需要include Support Library,然后添加相应的<meta-data>
。
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.ActivityB"
android:parentActivityName="com.example.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.MainActivity" />
</activity>
</application>
接下来在代码中直接使用如下的的方法就可以了
- ActionBar的Up 这段在配置文件中配置了可以不用
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
- 返回键调用的
@Override
public void onBackPressed() {
NavUtils.navigateUpFromSameTask(this);
super.onBackPressed();
}
参考资料
- NavUtils.navigateUpFromSameTask(this)
- Which one to use NavUtils.navigateUpFromSameTask() vs. onBackPressed()
Toolbar设置标题的问题
在使用Toolbar时,如果需要修改标题必须在onCreate()方法执行完成之后修改。因为在onCreate()方法中设置任何标题值都会被重置为AndroidManifest
中android:lable
的值。为了抵消这种行为,我们可以在onCreate()执行之后执行的onPostCreate()方法中执行修改标题的。
/**
* Called when activity start-up is complete (after onStart() and onRestoreInstanceState(Bundle) have been called).
*
* @param savedInstanceState
*/
@Override
public void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
//Toolbar 必须在onCreate()之后设置标题文本,否则默认标签将覆盖我们的设置
if (toolbar != null) {
toolbar.setTitle("零钱");
toolbar.setSubtitle("微信安全支付");
}
}