首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Android应用开发—通用的GridView网格分割线

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77622289 注:本文基于 Android RecyclerView 使用完全解析 体验艺术般的控件 中关于GridView网格分割线部分代码扩展而来。 原接口代码: import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.State; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; public class DividerGridItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spanCount == 0) { return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spanCount == 0) { return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; // 如果是最后一行,则不需要绘制底部 if (pos >= childCount) return true; } else { // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); // 如果是最后一行,则不需要绘制底部 if (isLastRaw(parent, itemPosition, spanCount, childCount)) { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount)) { // 如果是最后一列,则不需要绘制右边 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } } } 扩展后的代码: import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.State; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; public class DividerGridItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{android.R.attr.listDivider}; private Drawable mDivider; private Paint mColorPaint; private int mDividerHeight = 1; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } public DividerGridItemDecoration(Context context, int color, int height) { this(context); mColorPaint = new Paint(); mColorPaint.setColor(color); mDividerHeight = height; } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); int spanCount = getSpanCount(parent); int count = 0; if (childCount % spanCount != 0) { count = childCount; } else { count = childCount - spanCount; } for (int i = 0; i < count; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); if (mColorPaint != null) { c.drawRect(left, top, right, top + mDividerHeight, mColorPaint); } else { mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); if (mColorPaint != null) { c.drawRect(left, top, left + mDividerHeight, bottom, mColorPaint); } else { mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spanCount == 0) { return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { // 如果是最后一列,则不需要绘制右边 if ((pos + 1) % spanCount == 0) { return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; // 如果是最后一行,则不需要绘制底部 if (pos >= childCount) return true; } else { // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); // 如果是最后一行,则不需要绘制底部 if (isLastRaw(parent, itemPosition, spanCount, childCount)) { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount)) { // 如果是最后一列,则不需要绘制右边 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), mDivider.getIntrinsicHeight()); } } } 扩展的内容: 最后一行不画分割线。通常我们的需求是边框都不进行分割的绘制,而原来的代码没有做这部分的处理。(原接口只处理了最后一列的情况) 支持分割线的颜色和宽度绘制的定制化。(原接口只支持系统属性分割线的绘制)。绘制方式:DividerGridItemDecoration(Context context, int color, int height) 通过传递color和height进行绘制定制化。

优秀的个人博客,低调大师

iOS开发-UILabel和UIButton添加下划线

关于UILabel和UIButton有的时候需要添加下划线,一般有两种方式通过默认的NSMutableAttributedString设置,第二种就是在drawRect中画一条下划线,本文就简单的选择第一种,第二种有兴趣的可以自己研究一下。 UILabel设置下划线: 1 2 3 4 5 6 7 8 9 10 11 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 310, 50)]; label.backgroundColor = [UIColor redColor]; [label setLineBreakMode: NSLineBreakByWordWrapping ]; label.numberOfLines =3; [label setFont:[UIFont systemFontOfSize:14]]; NSMutableAttributedString *content = [[ NSMutableAttributedString alloc]initWithString:[ NSString stringWithFormat:@ "博文地址:http://www.cnblogs.com/xiaofeixiang 博客园-FlyElephant QQ群:228407086" ]]; NSRange contentRange = {0,[content length]}; [content addAttribute: NSUnderlineStyleAttributeName value:[ NSNumber numberWithInteger: NSUnderlineStyleSingle ] range:contentRange]; label.attributedText = content; [ self .view addSubview:label]; UIButton设置下划线: 1 2 3 4 5 6 7 8 9 UIButton *button=[[UIButton alloc]initWithFrame:CGRectMake(10, 200, 80, 30)]; NSMutableAttributedString *title = [[ NSMutableAttributedString alloc] initWithString:@ "FlyElephant" ]; NSRange titleRange = {0,[title length]}; [title addAttribute: NSUnderlineStyleAttributeName value:[ NSNumber numberWithInteger: NSUnderlineStyleSingle ] range:titleRange]; [button setAttributedTitle:title forState:UIControlStateNormal]; [button setBackgroundColor:[UIColor redColor]]; [button.titleLabel setFont:[UIFont systemFontOfSize:14]]; [ self .view addSubview:button]; 最终效果如下: 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4582292.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

史上最详细的Toolbar开发讲解,此篇必读!

Toolbar的简介 Toolbar 是 android 5.0 引入的一个新控件,Toolbar出现之前,我们很多时候都是使用ActionBar以及ActionActivity实现顶部导航栏的,因此Toolbar可以理解为是ActionBar的升级版。Toolbar大大扩展了ActionBar,使用更灵活,不像ActionBar那么固定,Toolbar更像是一般的View元素,可以被放置在view树体系的任意位置,可以应用动画,可以跟着scrollView滚动,可以与布局中的其他view交互。 Toolbar的基本使用 1、要想使用Toolbar,首先应该在Gradle的配置脚本里面添加V7兼容包(代码如下,版本是楠妹妹写本文的时候的版本),或者通过Android Studio的图形化界面的操作方法把V7兼容包依赖进来。 compile'com.android.support:appcompat-v7:23.1.1' 2、在我们需要顶部导航栏的布局文件当中添加Toolbar,并且配置一些常用的属性(使用自定义属性的时候需要注意把命名空间“app”添加到根节点)。 xmlns:app="http://schemas.android.com/apk/res-auto" 这里只列出一些常用的属性,比如最小高度,返回按钮的图标,背景等等。这里需要注意的是,属性值中的“?”表示对Android系统的主题样式进行重用。意思是如果我们改变了主题样式中的colorPrimary属性的话,Toolbar的背景颜色也会随之改变,因此提醒我们去主题样式中进行一些配置。 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?actionBarSize" app:navigationIcon="@mipmap/arrow_left" app:title="标题"/> 3、在styles.xml文件中进行一些常用的配置。由于我们使用的是 AppCompatActivity,因此必须使用AppCompat的相关主题,笔者这里使用亮色调的没有ActionBar的主题,注意需要在清单文件当中去使用自己定义的主题。为了完全去掉ActionBar,需要把windowActionBar、windowNoTitle以及加上android声明的也写上,确保把系统自带的以及第三方兼容包的ActionBar都彻底去掉。 <stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBar"> <itemname="colorPrimary">@color/red</item> <itemname="colorPrimaryDark">@color/green</item> <itemname="colorAccent">@color/blue</item> <itemname="android:textColorPrimary">@color/white</item> <itemname="android:windowActionBar">false</item> <itemname="android:windowNoTitle">true</item> <itemname="windowActionBar">false</item> <itemname="windowNoTitle">true</item> </style> 4、下面对主题中的几个颜色进行讲解,请参考下面的图片进行理解。 colorPrimaryDark是我们手机最顶端的状态栏的背景颜色(改变它需要Android5.0以及以上的手机支持才行)。 colorPrimary是指导航栏的颜色。 colorAccent是指我们常用控件比如Button等的颜色。 textColorPrimary是指我们导航栏中标题的颜色。 windowBackground是指我们窗体的默认颜色。 navigationBarColor是指Android手机中虚拟按键的背景颜色。 5、代码中对Toolbar进行常见的操作。可以通过ID找到Toolbar之后,可以对导航图标进行点击监听,前提必须是在布局文件或者java代码中添加了导航图标。同理也可以使用菜单,具体看注释,不再赘述。 Toolbartoolbar=(Toolbar)findViewById(R.id.toolbar); //对Toolbar左边的导航图标进行监听 toolbar.setNavigationOnClickListener(newView.OnClickListener(){ @Override publicvoidonClick(Viewv){ Toast.makeText(MainActivity.this,"返回",Toast.LENGTH_SHORT).show(); } }); //Toolbar中使用菜单toolbar.inflateMenu(R.menu.menu_main); toolbar.setOnMenuItemClickListener(newToolbar.OnMenuItemClickListener(){ @Override publicbooleanonMenuItemClick(MenuItemitem){ switch(item.getItemId()){ caseR.id.action_item1: Toast.makeText(MainActivity.this,"菜单1",Toast.LENGTH_SHORT).show(); returntrue; caseR.id.action_item2: Toast.makeText(MainActivity.this,"菜单2",Toast.LENGTH_SHORT).show(); returntrue; caseR.id.action_item3: Toast.makeText(MainActivity.this,"菜单3",Toast.LENGTH_SHORT).show(); returntrue; }returnfalse; } }); 6、运行效果图 Toolbar高级使用篇--自定义Toolbar 通过下面的对比可以知道,原生的Toolbar画面太美不忍直视,一般来说要在项目当中使用Toolbar我们都应该去自定义Toolbar。下面开始讨论如何去自定义Toolbar。 下面先让我给出核心的要点: 自定义布局,添加到Toolbar当中 有必要的时候自定义一些属性 自定义Class继承Toolbar,读取自定义属性,对Toolbar的布局显示,内容进行设置,最后需要对外公开一些函数用于设置标题、监听等。下面通过步骤来详细说明。 1、写一个自定义的布局,用来放入自定义Toolbar。 <?xmlversion="1.0"encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginRight="10dp"> <ImageView android:id="@+id/toolbar_leftButton" android:layout_width="@dimen/icon_size" android:layout_height="@dimen/icon_size" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:src="@mipmap/icon_background" android:textColor="@color/white" android:visibility="visible" /> <ImageView android:id="@+id/toolbar_rightButton" android:layout_width="@dimen/icon_size" android:layout_height="@dimen/icon_size" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@mipmap/icon_background" android:textColor="@color/white" android:visibility="visible" /> <EditText android:id="@+id/toolbar_searchview" style="@style/search_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_toLeftOf="@id/toolbar_rightButton" android:layout_toRightOf="@id/toolbar_leftButton" android:drawableLeft="@mipmap/icon_search" android:gravity="center" android:hint="请输入搜索内容" android:visibility="gone" /> <TextView android:id="@+id/toolbar_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_gravity="center" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_toLeftOf="@id/toolbar_rightButton" android:layout_toRightOf="@id/toolbar_leftButton" android:gravity="center" android:textColor="@color/white" android:textSize="20sp" android:visibility="gone" /> </RelativeLayout> </RelativeLayout> 让我们通过下面两张效果图来进行说明吧O(∩_∩)O~~。 由于一般不推荐把宽高意外的属性写在最外面根节点,因此我在最外面的相对布局里面又内嵌了一个相对布局,并且设置了左右的边距(margin)。至于如何布局要根据实际项目而定。楠妹妹这里的需求是,标题和搜索框能够随时切换。因此标题和搜索框是通过项目布局重叠在一起的,需要用到其中一个的时候就把另外一个隐藏掉。另外需要注意的地方就是,左右按钮最好也不要用Toolbar自带的,因为可能会造成布局不对称问题,使得标题(搜索框)不能居中。在按钮不使用的时候,我们并不是通过gone的方法隐藏掉的,而是通过@mipmap/icon_background空白图片来进行占位,保持布局对称。 2、在values文件夹新建attrs.mxl文件,用于存放自定义的一些属性。这些属性都可以通过字面意思读懂,不详细解释了。 <?xmlversion="1.0"encoding="utf-8"?> <resources> <declare-styleablename="CNToolbar"> <attrname="showSearchView"format="boolean"/> <attrname="leftButtonIcon"format="reference"/> <attrname="rightButtonIcon"format="reference"/> <attrname="myTitle"format="string"/> </declare-styleable> </resources> 3、自定义Class继承Toolbar。代码的主要工作是初始化界面还有监听器,对外公开操作的接口。 初始化界面的时候需要把自定义属性的值通过TintTypedArray读取进来,然后进行一些界面显示方面的设置。 初始化监听器,需要用到接口的回调。具体步骤是公开的声明接口,接口里面有onClick方法;声明该接口的实现,作为Toolbar的私有成员变量;公开setListener方法,把传进来的Listener实现类赋值给这个成员变量;在必须的时候调用成员变量的onClick方法(如在左边的按钮的点击事件中调用)。 公开一些函数,比如设置标题,设置是否显示搜索框、标题等等。 /** *自定义的导航栏 */publicclassCNToolbarextendsToolbar{ privateTextViewtoolbar_title; privateEditTexttoolbar_searchview; privateImageViewtoolbar_leftButton; privateImageViewtoolbar_rightButton; privateViewmChildView; privatebooleanshowSearchView; privateDrawableleft_button_icon; privateDrawableright_button_icon; privateStringtitle; publicCNToolbar(Contextcontext){ this(context,null,0); }publicCNToolbar(Contextcontext,@NullableAttributeSetattrs){ this(context,attrs,0); }publicCNToolbar(Contextcontext,@NullableAttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr);//通过代码得到布局文件当中一些属性的值 finalTintTypedArraya=TintTypedArray.obtainStyledAttributes(getContext(),attrs, R.styleable.CNToolbar,defStyleAttr,0); showSearchView=a.getBoolean(R.styleable.CNToolbar_showSearchView,false); left_button_icon=a.getDrawable(R.styleable.CNToolbar_leftButtonIcon); right_button_icon=a.getDrawable(R.styleable.CNToolbar_rightButtonIcon); title=a.getString(R.styleable.CNToolbar_myTitle); a.recycle();//初始界面 initView();//初始监听器 initListener(); }/** *初始化布局 */ privatevoidinitView(){ if(mChildView==null){ mChildView=View.inflate(getContext(),R.layout.toolbar,null); toolbar_title=(TextView)mChildView.findViewById(R.id.toolbar_title); toolbar_searchview=(EditText)mChildView.findViewById(R.id.toolbar_searchview); toolbar_leftButton=(ImageView)mChildView.findViewById(R.id.toolbar_leftButton); toolbar_rightButton=(ImageView)mChildView.findViewById(R.id.toolbar_rightButton); //添加自定义的布局到Toolbar addView(mChildView);//设置标题、搜索框、左右按钮是否显示,并且设置按钮的图标 if(showSearchView){ showSearchview(); hideTitle(); }else{ hideSearchview(); showTitle(); if(title!=null){ toolbar_title.setText(title); } }if(left_button_icon!=null){ toolbar_leftButton.setImageDrawable(left_button_icon); }if(right_button_icon!=null){ toolbar_rightButton.setImageDrawable(right_button_icon); } } }/** *重写设置标题的方法 * *@paramtitle */ @Override publicvoidsetTitle(CharSequencetitle){ toolbar_title.setText(title); }@Override publicvoidsetTitle(@StringResintresId){ toolbar_title.setText(resId); }/** *设置左右按钮的图标 * *@paramd */ publicvoidsetLeftButtonIconDrawable(Drawabled){ toolbar_leftButton.setImageDrawable(d); }publicvoidsetRightButtonIconDrawable(Drawabled){ toolbar_rightButton.setImageDrawable(d); }/** *标题与搜索框的切换 */ publicvoidsetShowSearchView(){ hideTitle(); showSearchview(); }publicvoidsetShowTitleView(Stringtitle){ hideSearchview(); showTitle(); toolbar_title.setText(title); }/** *左右按钮的监听 */ privatevoidinitListener(){ toolbar_leftButton.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ if(onLeftButtonClickListener!=null){ onLeftButtonClickListener.onClick(); } } }); toolbar_rightButton.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ if(onRightButtonClickListener!=null){ onRightButtonClickListener.onClick(); } } }); }publicinterfaceOnLeftButtonClickListener{ voidonClick(); }publicinterfaceOnRightButtonClickListener{ voidonClick(); }privateOnLeftButtonClickListeneronLeftButtonClickListener; privateOnRightButtonClickListeneronRightButtonClickListener; publicvoidsetOnLeftButtonClickListener(OnLeftButtonClickListenerlistener){ onLeftButtonClickListener=listener; }publicvoidsetOnRightButtonClickListener(OnRightButtonClickListenerlistener){ onRightButtonClickListener=listener; }/** *设置标题或者搜索框是否显示 */ privatevoidshowTitle(){ toolbar_title.setVisibility(View.VISIBLE); }privatevoidhideTitle(){ toolbar_title.setVisibility(View.GONE); }privatevoidshowSearchview(){ toolbar_searchview.setVisibility(View.VISIBLE); }privatevoidhideSearchview(){ toolbar_searchview.setVisibility(View.GONE); } } 4、使用,在必须的地方如同一般的控件去使用就可以了,注意加上自定义属性的命名空间,一般为auto就可以了。 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.nan.cnshop.widget.CNToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?actionBarSize" app:leftButtonIcon="@mipmap/icon_back_32px" app:showSearchView="false" app:myTitle="首页" /> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 4、使用,在必须的地方如同一般的控件去使用就可以了,注意加上自定义属性的命名空间,一般为auto就可以了。 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.nan.cnshop.widget.CNToolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?actionBarSize" app:leftButtonIcon="@mipmap/icon_back_32px" app:showSearchView="false" app:myTitle="首页" /> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> 代码当中也可以使用了,具体就不再赘述了。 finalCNToolbartoolbar=(CNToolbar)v.findViewById(R.id.toolbar); toolbar.setOnLeftButtonClickListener(newCNToolbar.OnLeftButtonClickListener(){ @Override publicvoidonClick(){ toolbar.setShowSearchView(); } }); 作者:焕然一璐 来源:51CTO

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册