import android.app.Activity;
import android.content.Context;
import android.support.annotation.MenuRes;
import android.support.design.widget.AppBarLayout;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import com.keihong.imapp.common.R;
import com.keihong.imapp.utils.ViewFinder;
import java.lang.ref.WeakReference;
/**
* @author keihong.chan
* @time 2018/5/3 下午2:53
* @desc 自定义标题栏,统一样式(返回按钮、中间标题、菜单)
* @others 自定义控件 组合模式 (AppbarLayout/toolbar + menu)
*/
public class NormalAppbarLayout extends AppBarLayout {
private static WeakReference mActivity;
private View mRootLayout;
private ViewFinder mVFinder;
private TextView mTvTitle;
private Toolbar mToolbar;
private T findView(int resId) {
return mVFinder.findView(resId);
}
public NormalAppbarLayout(Context context) {
super(context);
}
public NormalAppbarLayout(Context context, AttributeSet attrs) {
super(context, attrs);
//在构造函数中,对标题栏布局进行动态加载
//参数二 给加载好的布局再添加一个父布局 这里想要指定为NormalAppbarLayout,出入this
mRootLayout = LayoutInflater.from(context).inflate(R.layout.lay_normal_appbar, this);
mVFinder = new ViewFinder(mRootLayout);//查找控件的帮助类
mTvTitle = findView(R.id.tv_title);
mToolbar = findView(R.id.toolbar);
mToolbar.setNavigationOnClickListener(new OnToolbarNavigationClickListener() {
});//设置默认的Toolbar返回按钮事件
//默认无菜单 所以不在构造函数中写菜单逻辑
}
/**
* 初始化标题
*
* @param activity
* @param title
*/
public void init(Activity activity, String title) {
mActivity = new WeakReference<>(activity);
mTvTitle.setText(title);
}
/**
* 为Toolbar设置菜单
*
* @param resId
* @param onMenuItemClickListener
*/
public void setMenu(@MenuRes int resId, Toolbar.OnMenuItemClickListener onMenuItemClickListener) {
mToolbar.inflateMenu(resId);
mToolbar.setOnMenuItemClickListener(onMenuItemClickListener);
}
/**
* 为toobar的navigation设置点击事件
*
* @param listener
*/
public void setNavigationClickListener(OnToolbarNavigationClickListener listener) {
mToolbar.setNavigationOnClickListener(listener);
}
/**
* 继承点击事件,封装常用逻辑
*
* 把Activity finish封装进去
*/
public static abstract class OnToolbarNavigationClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
//默认 Toolbar 返回按钮是关闭Activity 可以覆写
mActivity.get().finish();
}
}
}
"1.0" encoding="utf-8"?>
.support.design.widget.AppBarLayout 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:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="@dimen/actionBarSize"
android:background="@color/colorPrimary"
app:navigationIcon="@drawable/ic_arrow_back">
"@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textAppearance="@style/Theme.ToolBar.Base.Title"
tools:text="title" />
.support.v7.widget.Toolbar>
.support.design.widget.AppBarLayout>
此代码忘记是哪位大神写的 若看到请告知
改用普通的findViewById或用ButteKnife也行
/**
* Function:快速查找控件的帮助类
*/
public class ViewFinder
{
private final String ERROR = "ViewFinder error: must set up layout !";
private View mLayout;
private SparseArray mViews;
public ViewFinder(View layout)
{
this.mLayout = layout;
if (mLayout == null)
throw new IllegalArgumentException(ERROR);
this.mViews = new SparseArray<>();
}
/**
* 获取布局
*/
public View getLayout()
{
return mLayout;
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*/
public T findView(int viewId)
{
View view = mViews.get(viewId);
if (view == null)
{
view = mLayout.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
/**
* 通过控件Id设置其对应的点击事件
*
* @param viewId 控件id
* @param listener 点击事件
* @return 该控件
*/
public View addClick(int viewId, View.OnClickListener listener)
{
View view = findView(viewId);
if (view != null)
view.setOnClickListener(listener);
return view;
}
/**
* 设置控件点击事件
*
* @param view 控件对象
* @param listener 点击事件
* @return 该控件
*/
public View addClick(View view, View.OnClickListener listener)
{
if (view != null)
view.setOnClickListener(listener);
return view;
}
}
注释处为自定义toolbar navigation的点击事件
...
private void initAppbar() {
mAppbarLayout.init(this, "我的远程指导预约情况");
// mAppbarLayout.setNavigationClickListener(new NormalAppbarLayout.OnToolbarNavigationClickListener() {
// @Override
// public void onClick(View v) {
// App.showToast("关闭啦哈哈哈", MyApplication.ToastType.SUCCESS);
// super.onClick(v);
// }
// });
mAppbarLayout.setMenu(R.menu.menu_plan_detail, new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_feedback:
App.showToast("知道啦", MyApplication.ToastType.SUCCESS);
break;
case R.id.action_download:
App.showToast("想得美", MyApplication.ToastType.SUCCESS);
break;
}
return true;
}
});
}
<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="match_parent"
android:orientation="vertical">
<com.keihong.imapp.common.widget.NormalAppbarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="@dimen/actionBarSize" />
LinearLayout>
menu文件就不给出了 懒