使ActionBar(Toolbar)的Up导航和实体按键Back实现同步

来源:互联网 发布:mac下载软件存在那 编辑:程序博客网 时间:2024/05/03 08:28

前言

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后调用setDisplayHomeAsUpEnabledgetSupportActionBar().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

其中setHomeButtonEnabledsetDisplayShowHomeEnabled共同起作用,如果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()方法中设置任何标题值都会被重置为AndroidManifestandroid: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("微信安全支付");        }    }
0 0
原创粉丝点击