Toolbar出现于Android5.0用于替代Actionbar
要使用Toolbar首先需要将AppTheme设为Theme.AppCompat.Light.NoActionBar,然后在布局中添加widget android.support.v7.widget.Toolbar。最后在类文件中调用setSupportActionBar方法将Toolbar设置为该应用的标题栏。
要向Toolbar中添加控件,有两种方式,
一种是利用menu菜单,另一种是直接在android.support.v7.widget.Toolbar布局中添加。第一种需要重写onCreateOptionsMenu方法将menu绑定在toolbar中,进行事件监听也需要重写Toolbar.OnMenuItemClickListener接口中的onMenuItemClick方法。
在Toolbar中可以实现点击按钮弹出下拉菜单,要实现此功能需要用到PopupWindow类,实例化该类时需要有一个布局与其绑定,该布局即是下拉菜单的布局。获得PopupWindow对象后,就可以调用showAsDropDown方法将菜单显示出来。
以下为demo:
MainActivity.class
import android.graphics.Rect;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.PopupWindow;
import android.widget.Toast;
import java.security.acl.Group;
public class MainActivity extends AppCompatActivity implements Toolbar.OnMenuItemClickListener{
private PopupWindow popupWindow;
private Toolbar toolbar;
private static final String TAG=MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=findViewById(R.id.toolBar);
//需放在setSupportActionBar(toolbar)前否则不生效或使用getSupportActionBar().setText()
toolbar.setTitle("Title");
toolbar.setNavigationIcon(R.drawable.ic_launcher_foreground);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"Navigation",Toast.LENGTH_SHORT).show();
}
});
toolbar.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"button",Toast.LENGTH_SHORT).show();
}
});
toolbar.setOnMenuItemClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.toolbar,menu);
return true;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.action_edit:
Toast.makeText(this,"action_edit",Toast.LENGTH_SHORT).show();
break;
case R.id.action_share:
Toast.makeText(this,"action_share",Toast.LENGTH_SHORT).show();
break;
case R.id.action_overflow:
popUpMenu();
break;
}
return true;
}
private void popUpMenu(){
Rect rect=new Rect();
//获取应用窗口视图
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
Log.i(TAG,"top:"+rect.top+" bottom:"+rect.bottom+"height:"+toolbar.getHeight());
int yoff=rect.top+toolbar.getHeight();
if(popupWindow==null){
View view=getLayoutInflater().inflate(R.layout.popupwindow,null);
//PopupWindow(View contentView, int width, int height, boolean focusable)
//ViewGroup.LayoutParams.WRAP_CONTENT指内容有多大宽/高就有多大
popupWindow=new PopupWindow(view, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
//void showAsDropDown (View anchor, int xoff, int yoff, int gravity)
//anchor:the view on which to pin the popup window
popupWindow.showAsDropDown(toolbar, 0, 0, Gravity.END | Gravity.TOP);
PopupListenner popupListenner=new PopupListenner();
view.findViewById(R.id.button1).setOnClickListener(popupListenner);
view.findViewById(R.id.button2).setOnClickListener(popupListenner);
}else{
popupWindow.showAsDropDown(toolbar, 0, 0, Gravity.END | Gravity.TOP);
}
}
class PopupListenner implements View.OnClickListener{
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.button1:
Toast.makeText(MainActivity.this,"button1",Toast.LENGTH_SHORT).show();
break;
case R.id.button2:
Toast.makeText(MainActivity.this,"button2",Toast.LENGTH_SHORT).show();
break;
}
}
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="match_parent"
tools:context="com.example.asus.toolbar.MainActivity">
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="30dp"
android:background="@color/toolbarBac"
app:titleTextAppearance="@style/ToolTheme">
<Button
android:id="@+id/button"
android:layout_width="40dp"
android:layout_height="wrap_content"
android:text="but"
android:textSize="6sp"/>
</android.support.v7.widget.Toolbar>
</android.support.constraint.ConstraintLayout>
popupwindow.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="pop1"/>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="pop2"/>
</LinearLayout>
styles.xml:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" 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>
<style name="ToolTheme" parent="Base.TextAppearance.Widget.AppCompat.Toolbar.Title">
<item name="android:textSize">10sp</item>
</style>
</resources>
menu.xml:
<?xml version="1.0" encoding="utf-8"?>
<menu 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"
tools:context=".MainActivity">
<item
android:id="@+id/action_edit"
android:icon="@drawable/ic_launcher_background"
android:orderInCategory="80"
android:title="action_edit"
app:showAsAction="always" />
<item
android:id="@+id/action_share"
android:icon="@drawable/ic_launcher_foreground"
android:orderInCategory="90"
android:title="action_share"
app:showAsAction="always" />
<item
android:id="@+id/action_overflow"
android:orderInCategory="100"
android:title="action_overflow"
android:icon="@drawable/ic_launcher_foreground"
app:showAsAction="always" />
</menu>
以下是效果图:
修改Toolbar标题文字大小的方法:
如上Style.xml中的代码,在style中设置Toolbar的Theme,添加如下:
<item name="android:textSize">10sp</item>
注:
setTitle只有在setSupportActionBar方法调用前调用在会生效,或通过使用getSupportActionBar().setText()修改标题。
API参考:
Toolbar
Popupmenu
Popupwindow