效果图:
如果想改变返回键的图片,我们也可以在代码中进行处理:
final ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setHomeAsUpIndicator(R.mipmap.main);
actionBar.setDisplayHomeAsUpEnabled(true);
}
可以看出这里并没有设置
actionBar.setHomeButtonEnabled(true);
也即是返回键可用,因为我们这里实现的是一个侧滑的效果。下面会有讲到。
首先,还是对这方面的知识(就自己目前所理解的来写)做一个总结。
我们如果要用AppCompatActivity来实现沉浸式菜单栏,个人觉得需要注意/了解的点:
1.因为在androidstuido中创建一个project之后,布局里面会自动生成一个toolbar。但是在此之前我们应该要知道,系统默认(不知道是不是应该叫做系统默认)的会有一个actionBar,如果我们在布局里面再写一个toolbar,就相当于是重复加了,创建project之后,直接运行项目之所以没有报错是因为我们在AndroidMainifest.xml中配置了android:theme=”@style/AppTheme.NoActionBar”
也即是去掉了系统默认actionBar
可以styles.xml从代码中看出
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
windowActionBar 设置为 false 就是不使用默认的actionBar
windowNoTitle 设置为 true 就是不使用标题
2.至于标题栏,目前还不能够用代码来设置它的位置,所以如果我们需要标题居中或者是其它,我们可以自己定义一个布局,来设置标题的显示位置。
如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="vertical"
tools:context=".MainActivity"
<!--这句很重要-->
android:fitsSystemWindows="true"
android:background="?attr/colorPrimaryDark" >
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:theme="@style/AppTheme.AppBarOverlay"
app:popupTheme="@style/AppTheme.PopupOverlay"
<!--这句很重要-->
android:fitsSystemWindows="true"
>
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@android:color/white"
android:textSize="20sp" />
</android.support.v7.widget.Toolbar>
</LinearLayout>
3.自带的返回键的使用
package demo.packg.myapplication;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends BaseActivity {
private Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv1= (TextView) findViewById(R.id.text1);
//因为MainActivity在AndroidMainifest中,配置了去掉系统自带的标题栏,所以加了一个toolbar
toolbar = (Toolbar) findViewById(R.id.toolbar);
initActionBar();
tv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(MainActivity.this,MainActivity2.class));
}
});
}
public void initActionBar() {
setSupportActionBar(toolbar);
final ActionBar actionBar = getSupportActionBar();
//设置返回键可用
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayShowHomeEnabled(true);//这两句就可以让actionBar的图标可以响应点击事件
actionBar.setDisplayHomeAsUpEnabled(true);//这一句主要用于后面返回效果,后面会讲
//由于标题栏名字的位置不能更改,所以想要更改标题栏的位置,就得自己自定义布局文件
actionBar.setTitle("首页");
//如果自己定义了标题栏,那么我们可以在这里设置标题栏为空
actionBar.setTitle(null);
}
}
这样写的话,我们仅可以看到是返回键的显示,但是点击效果却没有实现。
我们可以在公共的Activity中,如:BaseActivity中去添加一个这样的方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if (item.getItemId() == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
这样说,肯定会有人不理解,附上一个参考案例,
http://blog.csdn.net/flowingflying/article/details/14001855
好了步入正题:
先说实现步骤:
1.加依赖:
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
2.在布局文件中进行书写(参考上面的那个布局就可以了)
至于属性:
android:fitsSystemWindows=”true”从网上看到的是说,加在最外层的布局中,因为我做项目的时候,刚开始用到的是 用样式来实现的,所以toolbar中也加的有,不过经过测试,如果在代码中实现的话,也不会影响效果。只针对最外层起作用的原因。
3.最重要的我觉得就是样式的配置了
在此,我简单的提一下吧。
因为我们用了toolbar,所以样式中的那两个属性
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
肯定要是全局的(在AndroidMainifest.xml中)
顺便解释一下:
<item name="colorPrimary">@color/colorPrimary</item>
<item name=