Android利用FlexboxLayout轻松实现流动布局
发布时间 - 2026-01-11 00:47:13 点击率:次前言

相信大家应该都有所体会,在以前我们要实现流动性布局,比较繁琐,Google开源了一个项目叫FlexboxLayout,相信大家都不陌生。下面我们来学习一下FlexboxLayout基础知识,并通过一个案例来加深理解。如果你对FlexboxLayout很熟悉,请忽略本文。
一、什么是 Flexbox
简单来说 Flexbox 是属于web前端领域CSS的一种布局方案,是2009年W3C提出了一种新的布局方案,可以响应式地实现各种页面布局,并且 React Native 也是使用的 Flex 布局。
我们可以简单的理解为 Flexbox 是CSS领域类似 Linearlayout 的一种布局,但比 Linearlayout 要强大的多。
二、 什么是 FlexboxLayout?
我们在 Android 开发中使用 Linearlayout + RelativeLayout 基本可以实现大部分复杂的布局,但是Google就想了,有没有类似 Flexbox 的一个布局呢?这使用起来一个布局就可以搞定各种复杂的情况了,于是 FlexboxLayout 就应运而生了。
所以 FlexboxLayout 是针对 Android 平台的,实现类似 Flexbox 布局方案的一个开源项目
我们先看看官方Demo的效果图
开源地址:https://github.com/google/flexbox-layout
本地下载:点击这里
三、使用方式
使用方式很简单,只需要添加以下依赖:
compile 'com.google.android:flexbox:0.2.2'
在xml布局中我们可以这样使用
<com.google.android.flexbox.FlexboxLayout android:id="@+id/flexbox_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:flexWrap="wrap"> <TextView android:id="@+id/tv1" android:layout_width="120dp" android:layout_height="80dp" app:layout_flexBasisPercent="50%" /> <TextView android:id="@+id/tv2" android:layout_width="80dp" android:layout_height="80dp" app:layout_alignSelf="center"/> <TextView android:id="@+id/tv3" android:layout_width="160dp" android:layout_height="80dp" app:layout_alignSelf="flex_end"/> </com.google.android.flexbox.FlexboxLayout>
代码中可以这样使用
FlexboxLayout flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout); flexboxLayout.setFlexDirection(FlexboxLayout.FLEX_DIRECTION_COLUMN); View view = flexboxLayout.getChildAt(0); FlexboxLayout.LayoutParams lp = (FlexboxLayout.LayoutParams) view.getLayoutParams(); lp.order = -1; lp.flexGrow = 2; view.setLayoutParams(lp);
我们来看看要模仿的布局
下面我们来实现它,先来看最终实现的效果:
实现方法如下:
1. 新建activity_flow.xml布局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns: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"> <com.google.android.flexbox.FlexboxLayout android:id="@+id/flexbox_layout" android:layout_width="match_parent" android:layout_height="wrap_content" app:flexWrap="wrap" /> </RelativeLayout>
布局很简单,只有一个FlexboxLayout 因为我们需要动态创建它的item,所以就在这里固定写TextView了
2. 新建ActivityFlow Activity,填充数据源
String[] tags = {"婚姻育儿", "散文", "设计", "上班这点事儿", "*天堂", "大学生活", "美人说", "运动和健身", "工具癖", "生活家", "程序员", "想法", "短篇小说", "美食", "教育", "心理", "奇思妙想", "美食", "摄影"};
flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);
for (int i = 0; i < tags.length; i++) {
Book model = new Book();
model.setId(i);
model.setName(tags[i]);
flexboxLayout.addView(createNewFlexItemTextView(model));
}
其中Book为一个实体,这个不是关键,关键的是createNewFlexItemTextView方法
我们要动态加载FlexboxLayout其FlexItem 并且让FlexboxLayout中的item支持点击事件,因为我们需要知道用户点击了哪个专题跳转。
我们来看一下createNewFlexItemTextView方法
/**
* 动态创建TextView
* @param book
* @return
*/
private TextView createNewFlexItemTextView(final Book book) {
TextView textView = new TextView(this);
textView.setGravity(Gravity.CENTER);
textView.setText(book.getName());
textView.setTextSize(12);
textView.setTextColor(getResources().getColor(R.color.colorAccent));
textView.setBackgroundResource(R.drawable.tag_states);
textView.setTag(book.getId());
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Log.e(TAG, book.getName());
}
});
int padding = Util.dpToPixel(this, 4);
int paddingLeftAndRight = Util.dpToPixel(this, 8);
ViewCompat.setPaddingRelative(textView, paddingLeftAndRight, padding, paddingLeftAndRight, padding);
FlexboxLayout.LayoutParams layoutParams = new FlexboxLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
int margin = Util.dpToPixel(this, 6);
int marginTop = Util.dpToPixel(this, 16);
layoutParams.setMargins(margin, marginTop, margin, 0);
textView.setLayoutParams(layoutParams);
return textView;
}
其他有关Book实体和Util类,也贴出来一下
Book实体
public class Book {
private int id;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Book() {
}
}
Util工具类
public class Util {
public static int pixelToDp(Context context, int pixel) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return pixel < 0 ? pixel : Math.round(pixel / displayMetrics.density);
}
public static int dpToPixel(Context context, int dp) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return dp < 0 ? dp : Math.round(dp * displayMetrics.density);
}
}
这样关于流动布局[FlexboxLayout],我们就实现完成了,是不是很简单。
总结
以上就是关于Android轻松搞定流动布局(FlexboxLayout)的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# flexboxlayout
# android流动布局
# android
# Android startActivityForResult实例详解
# Android在Fragment中实现监听触摸事件
# Android 使用FragmentTabhost代替Tabhost
# Android数据持久化之File机制分析
# Android数据持久化之Preferences机制详解
# Android 如何本地加载pdf文件
# android手机端与PC端使用adb forword通信
# Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法
# Android 7.0行为变更 FileUriExposedException解决方法
# 很简单
# 开源
# 我们可以
# 的是
# 都不
# 本地下载
# 提出了
# 点击这里
# 想了
# 来看看
# 你对
# 只有一个
# 应运而生
# 人说
# 只需要
# 可以实现
# 跳转
# 短篇小说
# 谢谢大家
# 来实现
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
如何快速搭建FTP站点实现文件共享?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
Laravel如何处理文件下载请求?(Response示例)
如何自定义建站之星网站的导航菜单样式?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤
iOS UIView常见属性方法小结
如何在云主机上快速搭建多站点网站?
太平洋网站制作公司,网络用语太平洋是什么意思?
如何在建站主机中优化服务器配置?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
香港网站服务器数量如何影响SEO优化效果?
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel如何使用Telescope进行调试?(安装和使用教程)
javascript如何操作浏览器历史记录_怎样实现无刷新导航
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
Laravel如何实现一对一模型关联?(Eloquent示例)
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel如何使用Service Container和依赖注入?(代码示例)
C++时间戳转换成日期时间的步骤和示例代码
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
简单实现Android文件上传
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
用v-html解决Vue.js渲染中html标签不被解析的问题
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何配置任务调度?(Cron Job示例)
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
浅谈Javascript中的Label语句
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
如何在云主机上快速搭建网站?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
*服务器网站为何频现安全漏洞?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
Python正则表达式进阶教程_复杂匹配与分组替换解析
潮流网站制作头像软件下载,适合母子的网名有哪些?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
香港服务器WordPress建站指南:SEO优化与高效部署策略
Laravel distinct去重查询_Laravel Eloquent去重方法
C++用Dijkstra(迪杰斯特拉)算法求最短路径
如何彻底卸载建站之星软件?
Laravel怎么上传文件_Laravel图片上传及存储配置

