怎么自定义Android标题栏修改TitleBar的布局?

怎么自定义Android标题栏修改TitleBar的布局?,第1张

Android程序默认的Activity标题栏只能显示一段文字,而且不能改变它的布局、颜色、标题栏的高度等。如果想要在标题栏加上个图标、button、输入框、进度条、修改标题栏颜色等,只能使用自定义的标题栏。自定义标题栏可以通过在onCreate函数中添加以下代码来实现,需要注意的是代码的顺序必须按照下面的样式,否则将无效。

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE)

setContentView(R.layout.mainactivity) //Activity的布局

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.titlebar) //标题栏的布局

虽然上面这样可以在标题栏加入一些控件,但是仍然不能改变标题栏的高度、背景色,要想达到这个目的,只能使用theme(主题)。因此往project里先添加一个style。改变背景色修改android:windowTitleBackgroundStyle的值,改变标题栏高度则修改android:windowTitleSize的值。下面是一个示例:


#778899


32dp
@style/CustomWindowTitleBackground


接着再修改AndroidManifest.xml文件,找到要自定义标题栏的Activity,添加上android:theme值,比如:

Java代码




android:theme值就是上面那个style.xml文件里定义的一个style的name值。

按照以上的步骤,修改标题栏布局、高度、背景色的功能就实现了。

先上效果图(改图比较简陋,用Axure RP Pro 7.0画的见谅哈):

程序猿看到类似这样的设计图的话都会在大脑里思考该如何布局。对于此图更多的是前半段是用viewpager进行广告图片的自动切换,下半部分是用 RecyclerView 的GridLayoutManager 多布局实现。其实呢,整体来说 ,都可以用一个RecyclerView来实现。下面进行简述RecyclerView 简单实现。

先从adapter里面实现:多布局的话首先会想到:getItemViewType

@Override

public int getItemViewType(int position) {

if(null==appShopMgr||appShopMgr.getTagAppHisVs().size()==0){

return 0

}else if (this.coverShopMgr == null) {

//return VIEW_TYPE_ITEM

return noGallery(position)

} else if (this.coverShopMgr .hasCover() == false) {

//return VIEW_TYPE_ITEM

return noGallery(position)

} else {

return position == 0 ? VIEW_TYPE_GALLERY :appShopMgr.getTagAppHisVs().get(position-1).type

}

分析下各种viewType,也就是分三部分,第一部分就是广告图片,第二是title,第三部分就是网格显示。

再看onCreateViewHolder和 onBindViewHolder

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

if (viewType == VIEW_TYPE_GALLERY) {

return new ShopCoverHolder(mInflater.inflate(

R.layout.holder_item_shop_cover_layout, parent, false))

}else if(viewType == RecycleViewModelType.TITLEITEM){

return new TitleViewHolder(mInflater.inflate(

R.layout.activity_app_shop_title_layout, parent, false))

} else if (viewType == RecycleViewModelType.GRALLYITEM) {

return new SetupAppHolder(mInflater.inflate(

R.layout.item_setup_app_layout, parent, false))

}

return null

}

@Override

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

int type= getItemViewType(position)

if(type==VIEW_TYPE_GALLERY){

onBindGallery((ShopCoverHolder) holder)

}else if(type==RecycleViewModelType.TITLEITEM){

position = position - (this.hasCover() ? 1 : 0)

MpTagAppHisV mpTagAppHisV= appMgr.getAppTagByIndex(position)

((TitleViewHolder) holder).titleTv.setText(mpTagAppHisV.title)

}else if(type==RecycleViewModelType.GRALLYITEM){

position = position - (this.hasCover() ? 1 : 0)

MpTagAppHisV mpTagAppHisV= appMgr.getAppTagByIndex(position)

if(mpTagAppHisV.isAdd){

onBindAddItem((SetupAppHolder) holder)

}else {

onBindItem((SetupAppHolder) holder, position, mpTagAppHisV.mpAppHisV)

}

}

}

以上都是通用而且比较容易理解的。接下来就得讲下主要的部分了。

public static class BaseAppColSpanLookup extends

GridLayoutManager.SpanSizeLookup {

protected GridLayoutManager layoutManager = null

protected BaseShopAppAdapter adapter

我们给RecyclerView设置一个列数为6的GridLayoutManager,然后再动态地为不同部位的item分别设置SpanSize为6(铺满)、3(1/2)、2(1/3)就行了,下图:

设置一个列数为6的GridLayoutManager:

recyclerView.setLayoutManager(new GridLayoutManager(recyclerView.

getContext(), 6, GridLayoutManager.VERTICAL, false))

到此就基本完成了。

补充:StaggeredGridLayoutManager.LayoutParams中提供了这样一个方法:

LayoutParams.setFullSpan(true)

作用是把当前item的宽度设为full(填满),也就是说如果使用StaggeredGridLayoutManager要么不设置,要么就只能填满,所以无法完成图上的效果。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11552386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存