摘要
現在開發的項目中,發現需求裏面,既有“返回圖標-標題文字”類型的普通toolbar,也有“返回圖標-標題文字-菜單圖標”和“文字-標題文字-文字”這種類型的,也就是說,Toolbar的左邊和右邊都有可能是文字或者圖標,而中間一般都是標題,所以尋思着封裝下toolbar,使之能適應這種需求。
正文
要做的東西很簡單,就是自定義一個佈局,然後左邊放一個ImageView和一個TextView,中間放一個TextView,右邊同樣放一個ImageView和一個TextView。然後暴露一些方法給使用者去定義文字或者圖標咯。使用時,如果是兩邊有文字,而不是圖標,則需先定義點擊監聽事件,再設置文本(本來文字就是爲了點擊的,所以在setText方法裏給設置了click監聽事件,故而監聽事件不能爲空,所以要先定義監聽事件再設置文本內容),實現的方式有很多,這邊的代碼也很簡單,沒有太多需要講的地方,不過要優化的地方也有,待日後有空了優化一遍=_=!!
public class ToolBarHelper implements Toolbar.OnMenuItemClickListener, View.OnClickListener {
private FrameLayout mRootLayout;
private Toolbar mToolbar;
private View mTargetView;
private FrameLayout mTargetLayout ;
public LayoutInflater mInflater;
private boolean hasArrow;
View view ;
TextView tvLeft ;
TextView tvRight ;
ImageView ivIcon ;
OnToolbarRightItemClickListener onToolbarRightItemClickListener;
OnToolbarLeftItemClickListener onToolbarLeftItemClickListener ;
RelativeLayout rightLayout;
public ToolBarHelper(Context context, LayoutInflater inflater, int layoutID,boolean hasArrow) {
this.mInflater = inflater;
this.mTargetView = mInflater.inflate(layoutID, null);
initView(context,hasArrow);
}
public ToolBarHelper(Context context, LayoutInflater inflater, View view,boolean hasArrow) {
this.mInflater = inflater;
this.mTargetView = view;
initView(context,hasArrow);
}
private void initView(Context context,boolean hasArrow) {
FrameLayout.LayoutParams layoutParam = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
FrameLayout.LayoutParams layoutParamMarginTop = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
layoutParamMarginTop.topMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 56, context.getResources().getDisplayMetrics());
mRootLayout = new FrameLayout(context);
mRootLayout.setLayoutParams(layoutParam);
mTargetLayout = new FrameLayout(context) ;
mTargetLayout.setLayoutParams(layoutParamMarginTop);
mTargetLayout.addView(mTargetView);
mRootLayout.addView(mTargetLayout);
this.hasArrow = hasArrow;
view = mInflater.inflate(R.layout.tool_bar_layout, mRootLayout);
tvLeft = (TextView) view.findViewById(R.id.toolbar_remark);
tvRight = (TextView) view.findViewById(R.id.toolbar_menu);
ivIcon = (ImageView) view.findViewById(R.id.img_icon) ;
mToolbar = (Toolbar) view.findViewById(R.id.id_tool_bar);
rightLayout = (RelativeLayout) view.findViewById(R.id.toolbar_right_layout);
if (hasArrow){
mToolbar.setNavigationIcon(R.mipmap.fanhui);
}
mToolbar.setNavigationOnClickListener(this);
mToolbar.setOnMenuItemClickListener(this);
}
public void setLeftText(String text) {
tvLeft.setText(text);
tvLeft.setVisibility(View.VISIBLE);
setLeftClick();
}
public TextView getLeftText() {
if (tvLeft == null) {
tvLeft = (TextView) view.findViewById(R.id.toolbar_remark) ;
}
return tvLeft;
}
public TextView getRigtText() {
if (tvRight == null) {
tvRight = (TextView) view.findViewById(R.id.toolbar_menu) ;
}
return tvRight;
}
public ImageView getRigtIcon() {
if (ivIcon == null) {
ivIcon = (ImageView) view.findViewById(R.id.img_icon) ;
}
return ivIcon;
}
public void setLeftText(int text) {
tvLeft.setText(text);
tvLeft.setVisibility(View.VISIBLE);
setLeftClick();
}
public void setRightText(String right) {
tvRight.setText(right);
tvRight.setVisibility(View.VISIBLE);
setRightClick();
}
private void setLeftClick() {
if (this.onToolbarLeftItemClickListener != null) {
tvLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onToolbarLeftItemClickListener.onLeftItemClick();
}
});
}
}
private void setRightClick() {
if (this.onToolbarRightItemClickListener != null) {
rightLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onToolbarRightItemClickListener.onRightItemClick();
}
});
}
}
public void setRightText(int right) {
tvRight.setText(right);
tvRight.setVisibility(View.VISIBLE);
setRightClick();
}
public void setTitle(String title) {
TextView tvTitle = (TextView) view.findViewById(R.id.toolbar_title);
tvTitle.setText(title);
tvTitle.setVisibility(View.VISIBLE);
}
public void setTitle(int title) {
TextView tvTitle = (TextView) view.findViewById(R.id.toolbar_title);
tvTitle.setText(title);
tvTitle.setVisibility(View.VISIBLE);
}
public void setRightIcon(int icon) {
ivIcon.setVisibility(View.VISIBLE);
ivIcon.setImageResource(icon);
setRightIconClick();
}
public void setRightIcon(Drawable icon) {
ivIcon.setVisibility(View.VISIBLE);
ivIcon.setImageDrawable(icon);
setRightIconClick();
}
private void setRightIconClick() {
if (this.onToolbarRightItemClickListener != null) {
rightLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onToolbarRightItemClickListener.onRightItemClick();
}
});
}
}
public void setOnToolbarRightItemClickListener(OnToolbarRightItemClickListener onToolbarRightItemClickListener) {
this.onToolbarRightItemClickListener = onToolbarRightItemClickListener;
}
public void setOnToolbarLeftItemClickListener(OnToolbarLeftItemClickListener onToolbarLeftItemClickListener) {
this.onToolbarLeftItemClickListener = onToolbarLeftItemClickListener;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
if (mOnToolbarActionListener != null) {
mOnToolbarActionListener.onToolBarMenuItemClick(item);
}
return true;
}
@Override
public void onClick(View v) {
if (mOnToolbarActionListener != null) {
mOnToolbarActionListener.onToolBerNavigationClick(v);
}
}
public interface OnToolbarActionListener {
void onToolBerNavigationClick(View view);
void onToolBarMenuItemClick(MenuItem item);
}
private OnToolbarActionListener mOnToolbarActionListener;
public void setOnToolbarActionListener(OnToolbarActionListener l) {
this.mOnToolbarActionListener = l;
}
public FrameLayout getRootLayout() {
return mRootLayout;
}
public View getTargetView() {
return mTargetView;
}
public FrameLayout getmTargetLayout() {
return mTargetLayout;
}
public Toolbar getToolbar() {
return mToolbar;
}
public interface OnToolbarRightItemClickListener {
void onRightItemClick();
}
public interface OnToolbarLeftItemClickListener {
void onLeftItemClick() ;
}
}
裏面暴露了設置左右文字,右邊圖標等方法,如果想自定義文字和圖標其他屬性,也可以取到這些控件,然後直接賦相應值。就不贅述了。