关于ToolBar的解析:
自定义ToolBar,首先
ToolBar是Android
5.0推出的一个新的控件用于取代之前的ActionBar,具有很强的可塑造型,用户可以根据自己的喜好自定义ToolBar,一些低版本需要引用android-support-v7包才可以自定义ToolBar,本文将引用v7包,进行ToolBar的讲解:
第一步:修改Styles.xml
:
<resources>
<!--设置自定义的ToolBar,其中Light是颜色偏明亮一点的主题,也可以去掉,那主题的颜色等都需要自己设定
这里的AppTheme要与AndroidManifest.xml中的保持一致,否则需要重新注册-->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!--若不为NoActionBar一定要加上这两句,这里可以不加-->
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<!--设置自己的ToolBar颜色-->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--设置ToolBar中字体的颜色,为白色-->
<item name="android:textColor">#ffffff</item>
<!--设置ToolBar中Menu中三个点的颜色-->
<item name="android:textColorSecondary">#ffffff</item>
<!--设置ToolBar中Menu的弹出的主题-->
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
</style>
<!--设置ToolBar中Menu的弹出的主题-->
<style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow">
<!-- 默认为true,会与Toolbar有覆盖 -->
<item name="overlapAnchor">false</item>
<!-- 背景颜色设置 -->
<item name="android:popupBackground">@color/colorPrimary</item>
<!-- 弹出的Menu竖直上与Toolbar的距离,保证不会覆盖Toolbar -->
<item name="android:dropDownVerticalOffset">3dp</item>
<!-- 弹出的Menu水平上与屏幕间的距离 -->
<item name="android:dropDownHorizontalOffset">0dp</item>
</style>
</resources>
注意当引用的v7的包后,使用Toolbar,MainActivity一定要继承AppCompatActivity,而不再是Activity。
注意Stylesxml的布局,与引用。
第二步:修改activity_main.xml:
<!-- 这里定义为auto,在ToolBar中就可以自定义的添加toolbar:title之类的属性,就像在Activity中效果一样 -->
<RelativeLayout xmlns:android="
http://schemas.android.com/apk/res/android"
xmlns:tools="
http://schemas.android.com/tools"
xmlns:toolbar="
http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#cccccc"
tools:context="com.example.mytoolbar.MainActivity" >
<!-- Toolbar本身是一个ViewGroup,所以在里面添加相应的TextView或其他,
颜色数值写成attr属性,这样做是为了屏蔽开发者对应具体数值,比如我们需要设置不同主题下的主色,副色,
或者是不同版本的ActionBar大小,亦或者是不同Dpi下的DrawerLayout的宽度等
app:popupTheme引用了在Styles中设定的主题 -->
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/OverflowMenuStyle"
toolbar:title="Title"
toolbar:titleTextColor="#ffffff" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="MyToolBar"
android:textColor="#ffffff" />
</android.support.v7.widget.Toolbar>
<!-- 这个ImageView是Activity中PopupMenu中用的,设置侦听,弹出相应的菜单,对应Activity中被注释掉的代码
但这种方法无法方便的与ToolBar中Menu菜单联系,较容易的修改相应的背景属性,而舍弃 -->
<!--
<ImageView
android:id="@+id/more"
android:layout_width="wrap_content"
android:layout_height="?attr/actionBarSize"
android:layout_alignParentRight="true"
android:onClick="popupmenu"
android:scaleType="center"
android:src="@drawable/common_forward_normal" />
-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/toolbar"
android:text="@string/hello_world"
android:textColor="#000000" />
</RelativeLayout>
可以考虑将ToolBar设置为一个单独的XMl文件,在Main中进行引用
第三步:修改MainActivity.java:
package com.example.mytoolbar;
import android.app.Activity;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Toolbar toolbar;
private ImageView more;
private PopupMenu popupMenu;
private Menu menu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
//使用PopupWindow来实现Menu,但是自定义的toolbar在主题中无法更改Menu主题
// popupMenu = new PopupMenu(this, findViewById(R.id.more));
// menu = popupMenu.getMenu();
//通过代码添加菜单项
// menu.add(Menu.NONE, Menu.FIRST + 0, 0, "复制");
// menu.add(Menu.NONE, Menu.FIRST + 1, 1, "粘贴");
// //通过XML文件添加菜单项
// MenuInflater menuInflater = getMenuInflater();
// menuInflater.inflate(R.menu.popupmenu, menu);
// popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
// public boolean onMenuItemClick(MenuItem item) {
// switch (item.getItemId()) {
// case R.id.save:
// Toast.makeText(MainActivity.this, "保存",
// Toast.LENGTH_LONG).show();
// break;
// case Menu.FIRST + 0:
// Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG)
// .show();
// break;
// case Menu.FIRST + 1:
// Toast.makeText(MainActivity.this, "粘贴", Toast.LENGTH_LONG)
// .show();
// break;
// default:
// break;
// }
// return false;
// }
// });
setSupportActionBar(toolbar);
//title在XML文件中设置为toolbar:title="Title",前提是
//在RelativeLayout中添加xmlns:toolbar="
http://schemas.android.com/apk/res-auto"
//用的不是android:命名空间,而是自定义命名空间
// 若采用toolbar.setTitle("Title"),并不能进行修改,默认为项目的名称
// getSupportActionBar().setTitle("Title");
getSupportActionBar().setSubtitle("subTitle");
getSupportActionBar().setLogo(R.drawable.ic_launcher);
toolbar.setNavigationIcon(R.drawable.ic_launcher2);
}
// //在XML中设置了Onclick
// public void popupmenu(View v) {
// popupMenu.show();
// }
// 使用toolbar来实现Menu,自定义的toolbar在主题中可以更改Menu主题,这里进行了重写,自定义了Menu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
menu=toolbar.getMenu();
//通过代码添加菜单项
menu.add(Menu.NONE, Menu.FIRST + 0, 0, "复制");
menu.add(Menu.NONE, Menu.FIRST + 1, 1, "粘贴");
//通过XML文件添加菜单项
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.popupmenu, menu);
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case Menu.FIRST + 0:
Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_SHORT).show();
break;
case Menu.FIRST + 1:
Toast.makeText(MainActivity.this, "粘贴", Toast.LENGTH_SHORT).show();
break;
case R.id.save:
Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_SHORT).show();
break;
case R.id.delete:
Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
break;
}
return true;//return false 的区别
}
});
return true;
}
}
其中通过不同方式进行了Menu弹出内容的修改,其中R.menu.main为Menu中的main.xml
<menu xmlns:android="
http://schemas.android.com/apk/res/android"
xmlns:tools="
http://schemas.android.com/tools"
tools:context="com.example.mytoolbar.MainActivity" >
<item
android:id="@+id/delete"
android:orderInCategory="100"
android:showAsAction="never"
android:title="删除"/>
</menu>
其中通过通过XML文件R.menu.popupmenu添加菜单项,本质上与R.menu.main是一致的,但可以从层次上进行考虑,R.menu.main属于更高一个层次,用于放于ToolBar中的侦听控件,而R.menu.popupmenu属于弹出的额菜单的内容设置。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="
http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/save"
android:title="保存"/>
</menu>
最终的效果图:
主要参考:http://blog.csdn.net/zhyh1986/article/details/51810803#comments
http://blog.csdn.net/hanj456/article/details/53579608
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2006.html