Android LinearLayout 自动换行

Android 自动换行的LinearLayout 【代码】Android 自动换行的LinearLayout。 阅读详情


  

由于前段时间项目中使用到了自动换行的线性布局,本来打算用表格布局在里面一个个的用Java代码添加ImageView的,但是添加的View控件是不确定的,因为得靠服务器的数据返回,就这样手动用Java代码画布局的方式就这样夭折了,因为在表哥布局中我无法确定一行显示多少个ImageView的数目,所以无法动态添加,最后自能自己去看看那种能够换行的线性布局了,线性布局比较不好的是不能自动换行,也就是当设置LinearLayout的orentation 设置为vertical 为竖直方向也就是只有一列,每行只能显示一个View或者View的子类,当设置LinearLayout的orentitation为Horizontal,LinearLayout的只能显示为一行,横向显示,当屏幕满了的时候,View控件并不会自动换行,所以我们要做的就是在LinearLayout满的时候自动换行。

需要了解的是怎么样绘制根据子控件的长宽绘制父控件的宽度与高度,所以需要传入的参数控件的高度,视图分为两种一种是View类型的,代表控件有TextView,Button,EditText 等等,还有一种是装视图的容器控件继承自ViewGroup的控件,如LinearLayout,RelativeLayout,TabHost等等控件,需要自动换行的线性布局的话,就需要根据子控件的高度与宽度,来动态加载父控件的高度与宽度,所以需要在构造函数中传入每一个子控件的固定的高度,或者是动态设置子控件的高度与宽度。

将自定义的LinearLayout 也继承自ViewGroup 并且重写抽象类ViewGrouop的几个方法:onMeasure(),onLayout(),dispathDraw()  三个方法的意思分别是:第一个onMeasure()是用来计算控件以及子控件所占用的区域,第二个onLayout()是控制子控件的换行,第三个可写可不写,主要是用来绘制控件的边框,

自定义LinearLayout的代码如下:

  1. package com.huanglong.mylinearlayout;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.graphics.Color;  
  6. import android.graphics.Paint;  
  7. import android.graphics.Rect;  
  8. import android.util.AttributeSet;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11.   
  12. /** 
  13.  * @author huanglong 2013-5-28 自定义自动换行LinearLayout 
  14.  */  
  15. public class FixGridLayout extends ViewGroup {  
  16.     private int mCellWidth;  
  17.     private int mCellHeight;  
  18.   
  19.     public FixGridLayout(Context context) {  
  20.         super(context);  
  21.     }  
  22.   
  23.     public FixGridLayout(Context context, AttributeSet attrs) {  
  24.         super(context, attrs);  
  25.     }  
  26.   
  27.     public FixGridLayout(Context context, AttributeSet attrs, int defStyle) {  
  28.         super(context, attrs, defStyle);  
  29.     }  
  30.   
  31.     public void setmCellWidth(int w) {  
  32.         mCellWidth = w;  
  33.         requestLayout();  
  34.     }  
  35.   
  36.     public void setmCellHeight(int h) {  
  37.         mCellHeight = h;  
  38.         requestLayout();  
  39.     }  
  40.   
  41.     /** 
  42.      * 控制子控件的换行 
  43.      */  
  44.     @Override  
  45.     protected void onLayout(boolean changed, int l, int t, int r, int b) {  
  46.         int cellWidth = mCellWidth;  
  47.         int cellHeight = mCellHeight;  
  48.         int columns = (r - l) / cellWidth;  
  49.         if (columns < 0) {  
  50.             columns = 1;  
  51.         }  
  52.         int x = 0;  
  53.         int y = 0;  
  54.         int i = 0;  
  55.         int count = getChildCount();  
  56.         for (int j = 0; j < count; j++) {  
  57.             final View childView = getChildAt(j);  
  58.             // 获取子控件Child的宽高  
  59.             int w = childView.getMeasuredWidth();  
  60.             int h = childView.getMeasuredHeight();  
  61.             // 计算子控件的顶点坐标  
  62.             int left = x + ((cellWidth - w) / 2);  
  63.             int top = y + ((cellHeight - h) / 2);  
  64.             // int left = x;  
  65.             // int top = y;  
  66.             // 布局子控件  
  67.             childView.layout(left, top, left + w, top + h);  
  68.   
  69.             if (i >= (columns - 1)) {  
  70.                 i = 0;  
  71.                 x = 0;  
  72.                 y += cellHeight;  
  73.             } else {  
  74.                 i++;  
  75.                 x += cellWidth;  
  76.   
  77.             }  
  78.         }  
  79.     }  
  80.   
  81.     /** 
  82.      * 计算控件及子控件所占区域 
  83.      */  
  84.     @Override  
  85.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  86.         // 创建测量参数  
  87.         int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);  
  88.         int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);  
  89.         // 记录ViewGroup中Child的总个数  
  90.         int count = getChildCount();  
  91.         // 设置子空间Child的宽高  
  92.         for (int i = 0; i < count; i++) {  
  93.             View childView = getChildAt(i);  
  94.             /* 
  95.              * 090 This is called to find out how big a view should be. 091 The 
  96.              * parent supplies constraint information in the width and height 
  97.              * parameters. 092 The actual mesurement work of a view is performed 
  98.              * in onMeasure(int, int), 093 called by this method. 094 Therefore, 
  99.              * only onMeasure(int, int) can and must be overriden by subclasses. 
  100.              * 095 
  101.              */  
  102.             childView.measure(cellWidthSpec, cellHeightSpec);  
  103.         }  
  104.         // 设置容器控件所占区域大小  
  105.         // 注意setMeasuredDimension和resolveSize的用法  
  106.         setMeasuredDimension(resolveSize(mCellWidth * count, widthMeasureSpec),  
  107.                 resolveSize(mCellHeight * count, heightMeasureSpec));  
  108.         // setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);  
  109.   
  110.         // 不需要调用父类的方法  
  111.         // super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
  112.     }  
  113.   
  114.     /** 
  115.      * 为控件添加边框 
  116.      */  
  117.     @Override  
  118.     protected void dispatchDraw(Canvas canvas) {  
  119.         // 获取布局控件宽高  
  120.         int width = getWidth();  
  121.         int height = getHeight();  
  122.         // 创建画笔  
  123.         Paint mPaint = new Paint();  
  124.         // 设置画笔的各个属性  
  125.         mPaint.setColor(Color.BLUE);  
  126.         mPaint.setStyle(Paint.Style.STROKE);  
  127.         mPaint.setStrokeWidth(10);  
  128.         mPaint.setAntiAlias(true);  
  129.         // 创建矩形框  
  130.         Rect mRect = new Rect(0, 0, width, height);  
  131.         // 绘制边框  
  132.         canvas.drawRect(mRect, mPaint);  
  133.         // 最后必须调用父类的方法  
  134.         super.dispatchDraw(canvas);  
  135.     }  
  136.   
  137. }  
package com.huanglong.mylinearlayout;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * @author huanglong 2013-5-28 自定义自动换行LinearLayout
 */
public class FixGridLayout extends ViewGroup {
	private int mCellWidth;
	private int mCellHeight;

	public FixGridLayout(Context context) {
		super(context);
	}

	public FixGridLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	public FixGridLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	public void setmCellWidth(int w) {
		mCellWidth = w;
		requestLayout();
	}

	public void setmCellHeight(int h) {
		mCellHeight = h;
		requestLayout();
	}

	/**
	 * 控制子控件的换行
	 */
	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		int cellWidth = mCellWidth;
		int cellHeight = mCellHeight;
		int columns = (r - l) / cellWidth;
		if (columns < 0) {
			columns = 1;
		}
		int x = 0;
		int y = 0;
		int i = 0;
		int count = getChildCount();
		for (int j = 0; j < count; j++) {
			final View childView = getChildAt(j);
			// 获取子控件Child的宽高
			int w = childView.getMeasuredWidth();
			int h = childView.getMeasuredHeight();
			// 计算子控件的顶点坐标
			int left = x + ((cellWidth - w) / 2);
			int top = y + ((cellHeight - h) / 2);
			// int left = x;
			// int top = y;
			// 布局子控件
			childView.layout(left, top, left + w, top + h);

			if (i >= (columns - 1)) {
				i = 0;
				x = 0;
				y += cellHeight;
			} else {
				i++;
				x += cellWidth;

			}
		}
	}

	/**
	 * 计算控件及子控件所占区域
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// 创建测量参数
		int cellWidthSpec = MeasureSpec.makeMeasureSpec(mCellWidth, MeasureSpec.AT_MOST);
		int cellHeightSpec = MeasureSpec.makeMeasureSpec(mCellHeight, MeasureSpec.AT_MOST);
		// 记录ViewGroup中Child的总个数
		int count = getChildCount();
		// 设置子空间Child的宽高
		for (int i = 0; i < count; i++) {
			View childView = getChildAt(i);
			/*
			 * 090 This is called to find out how big a view should be. 091 The
			 * parent supplies constraint information in the width and height
			 * parameters. 092 The actual mesurement work of a view is performed
			 * in onMeasure(int, int), 093 called by this method. 094 Therefore,
			 * only onMeasure(int, int) can and must be overriden by subclasses.
			 * 095
			 */
			childView.measure(cellWidthSpec, cellHeightSpec);
		}
		// 设置容器控件所占区域大小
		// 注意setMeasuredDimension和resolveSize的用法
		setMeasuredDimension(resolveSize(mCellWidth * count, widthMeasureSpec),
				resolveSize(mCellHeight * count, heightMeasureSpec));
		// setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);

		// 不需要调用父类的方法
		// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	/**
	 * 为控件添加边框
	 */
	@Override
	protected void dispatchDraw(Canvas canvas) {
		// 获取布局控件宽高
		int width = getWidth();
		int height = getHeight();
		// 创建画笔
		Paint mPaint = new Paint();
		// 设置画笔的各个属性
		mPaint.setColor(Color.BLUE);
		mPaint.setStyle(Paint.Style.STROKE);
		mPaint.setStrokeWidth(10);
		mPaint.setAntiAlias(true);
		// 创建矩形框
		Rect mRect = new Rect(0, 0, width, height);
		// 绘制边框
		canvas.drawRect(mRect, mPaint);
		// 最后必须调用父类的方法
		super.dispatchDraw(canvas);
	}

}
然后在Xml文件中引用自己定义的控件,在Java代码中调用:

  1. package com.huanglong.mylinearlayout;  
  2.   
  3. import android.os.Bundle;  
  4. import android.app.Activity;  
  5. import android.view.Menu;  
  6. import android.view.MenuItem;  
  7. import android.widget.CheckBox;  
  8. import android.widget.SimpleAdapter;  
  9. import android.support.v4.app.NavUtils;  
  10.   
  11. public class MainActivity extends Activity {  
  12.     private SimpleAdapter adapter;  
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         FixGridLayout fixGridLayout = (FixGridLayout) findViewById(R.id.ll);  
  18.         fixGridLayout.setmCellHeight(30);  
  19.         fixGridLayout.setmCellWidth(100);  
  20.         for (int i = 0; i < 7; i++) {  
  21.             CheckBox box = new CheckBox(MainActivity.this);  
  22.             box.setText("第"+i+"个");  
  23.             fixGridLayout.addView(box);  
  24.         }  
  25.     }  
  26.   
  27.     @Override  
  28.     public boolean onCreateOptionsMenu(Menu menu) {  
  29.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  30.         return true;  
  31.     }  
  32.   
  33.       
  34. }  
package com.huanglong.mylinearlayout;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.SimpleAdapter;
import android.support.v4.app.NavUtils;

public class MainActivity extends Activity {
	private SimpleAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FixGridLayout fixGridLayout = (FixGridLayout) findViewById(R.id.ll);
        fixGridLayout.setmCellHeight(30);
        fixGridLayout.setmCellWidth(100);
        for (int i = 0; i < 7; i++) {
			CheckBox box = new CheckBox(MainActivity.this);
			box.setText("第"+i+"个");
			fixGridLayout.addView(box);
		}
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    
}

效果截图:




Android自定义自动换行LinearLayout探索与实现 其中之一就是自动换行布局,即当容器内的子视图数量超过一行时,自动将多余的子视图放到下一行进行显示。通过使用这个自定义布局,我们可以轻松地实现自动换行的效果,从而更好地满足用户的多样化需求。通过以上的步骤,我们就成功地创建了一个自定义的自动换行LinearLayout,并实现了自动换行的布局效果。这个类将负责处理自动换行的逻辑。如上所示,我们可以在AutoWrapLinearLayout容器中放置任意数量的子视图,并且它们会根据容器的宽度进行自动换行。现在,我们可以使用这个自定义布局来实现自动换行的效果了。 阅读详情

相关推荐

Android kotlin自定义自动换行LinearLayout

在app开发中,自定义LinearLayout布局也是常见布局,由于工作开发需求需要要求kotlin实现的自定义可以自动换行的LinearLayout,为了完成需求实现这个功能,特来开发此功能

安卓兼职framework和app工程师的博客 1437

Android实现控件内自动换行(比如LinearLayout内部实现子控件换行 )

自动换行

qq_25330791的博客 2037

Android LinearLayout实现自动换行

主要为大家详细介绍了Android LinearLayout实现自动换行,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

android 自动换行linearlayout,Android LinearLayout实现自动换行效果

Android LinearLayout实现自动换行效果发布时间:2020-09-13 14:19:34来源:脚本之家阅读:431作者:星辰之力在我们开发过程中会经常遇见一些客户要求但是Android系统又不提供的效果,这时我们只能自己动手去实现它,或者从网络上借鉴他人的资源,本着用别人不如自己会做的心态,在此我总结了一下Android中如何实现自动换行的LinearLayout。在本文中,说是L...

weixin_32661683的博客 2283

Android LinearLayout实现自动换行效果

主要为大家详细介绍了Android LinearLayout实现自动换行效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

关于动态存储器dram中rank,bank,device之间的关系

DEVICE_WIDTH表示设备的带宽(单位bit),每个列(column)包含DEVICE_WIDTH 位(bit),每一行(row)包含NUM_COLS个column。   而每一个bank包含NUM_ROWS个行(row)。所以一个设备(device)的存储容量为PER_DEVICE_STORAGE =NUM_ROWS*NUM_COLS*DEVICE_WIDTH*NUM_BANKS (i

wyj7260的专栏 4733

java 安卓自动换行,Android源码分享-自动换行LinearLayout

Android开发中,很多人会遇到满行就自动换到下一行的界面需求,而Android自带的LinearLayout布局自能横排或者竖排,不够显示就加ScrollView,横竖混排就不行了。这里给大家分享一个可以实现自动换行的LinearLayout。import java.util.Hashtable;import android.content.Context;import android.uti...

weixin_42395823的博客 349

STM32CubeIDE之SHT3X温湿度传感器移植HAL库

有了前面的OLED的学习,这个学习起来也很快。 分以下几步走 1.你要有个温度传感器,SHT3X这个型号的,因为我要讲这个 2.你要有个STM32开发板(我用的是STM32L431RCT) 3.顺便找台电脑下载一个STM32CubeIDE 4.简单的找一个SHT3X的驱动,我是去某宝嫖的,一般卖这个的都有,这个驱动分两个文件,是.c和.h的,我直接把这两个放在下边 读了我上一篇的人,看这个应该很熟悉吧,一样的套路,学习方法是一样的,你就照搬就行 下面是sht3x.c的原文档,里面有个CRC..

qq_47736089的博客 2316

android 自动换行linearlayout,Android源码分享-自动换行LinearLayout

Android开发中,很多人会遇到满行就自动换到下一行的界面需求,而Android自带的LinearLayout布局自能横排或者竖排,不够显示就加ScrollView,横竖混排就不行了。这里给大家分享一个可以实现自动换行的LinearLayout。import java.util.Hashtable;import android.content.Context;import android.uti...

weixin_33218378的博客 646

Labview数据存储与读取——TDMS文件的创建与写入

Labview数据存储与读取——TDMS文件的创建与写入 你好,这是我在自学Labview编写软件过程中使用的一些功能。我在存储采集卡数据时,通过阅读大量他人的程序,发现TDM及TDMS文件十分适合波形数据的记录,TDMS文件比TDM文件在存储动态类型数据时读写速度更快,而且TDMS 文件没有容量限制,适合存储数据量庞大的测试数据。 前言少叙,书归正传 这一篇博客,说明一下如何使用基本的TDMS功能实现数据文件的存储。 所需要的控件如上图所示,在程序框图——编程——文件I\O——TDMS 中,写入TDMS

滑板小帅程序开发 2万+

mysql 计算不同胜率的活跃玩家的次日,3日,7日留存率

它根据每天的日期(logymd)和最高段位(max_rank)、胜率段落(win_rate_segment)进行分组,并计算总玩家人数(total_players)、第二天的留存人数(next_day_players)、第三天的留存人数(day3_players)和第七天的留存人数(day7_players)。注意:不是新手留存,是段位活跃玩家留存;最终的结果则是将留存数据进行展示,按照日期(date)、最高段位(rank_level)、胜率段落(win_rate_segment)进行排序。

weixin_42698221的博客 1837

Android开发之自动换行LinearLayout

Android开发中,很多人会遇到满行就自动换到下一行的界面需求,而Android自带的LinearLayout布局自能横排或者竖排,不够显示就加ScrollView,横竖混排就不行了。这里给大家分享一个可以实现自动换行的LinearLayout。

goup的专栏 1万+

基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,通过建立PMSM非线性状态空间模型,设计IOL控制器将系统转化为线性输入-输出映射。文章包含系统原理推导、Simulink建模步骤、参数整定方法和仿真结果分析,验证了IOL在高动态、宽速域工况下的优越性能(转矩误差降低90%)。最后提出了工程实现要点和扩展应用方向,为开发高精度电机驱动系统提供了实用指导。

xiaoheshang_123的博客 304

android第四张图片自动换行,Android LinearLayout实现自动换行效果

在我们开发过程中会经常遇见一些客户要求但是Android系统又不提供的效果,这时我们只能自己动手去实现它,或者从网络上借鉴他人的资源,本着用别人不如自己会做的心态,在此我总结了一下Android中如何实现自动换行的LinearLayout。在本文中,说是LinearLayout其实是继承自GroupView,在这里主要重写了两个方法,onMeasure、onLayout方法,下面我对此加以介绍。(...

weixin_39570838的博客 453

Embarcadero Dev-C++ 6.3安装教程【保姆级】

Embarcadero Dev-C++ 6.3安装教程,保姆级教程~

Thebest_jack的博客 1万+

通信原理期末考试试题及答案

五、(总分12分)设某信道具有均匀的的双边噪声功率谱密度在该信道中传输抑制载波的单边带(上边带)信号,并设调制信号m(t)的频带限制在5K HZ,而载波为100 K HZ,已调信号的功率为10KW。:(1)单边带信号的载频为100kHz,带宽B=5kHz,为使信号顺利通过,理想带通滤波器的中心频率为。8、对最高频率为fH的调制信号m(t)分别进行AM、DSB、SSB调制,相应已调信号的带宽分别为。7、设调制信号为f(t)载波为,则抑制载波双边带调幅信号的时域表达式为,频域表达式为。

qq_67692062的博客 2396

Android LinearLayout中TextView标签项自动换行的一种解决方案

在一些项目中,比如搜索,广告热门关键词dengd

拿铁不懂绿茶 2万+

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 269

java流布局换行_Android Flowlayout:LinearLayout内部控件自动换行

【实例简介】Android开源代码,自定义Layout,继承自LinearLayout,内部控件自动换行显示。例如:可用来开发数量变化的属性标签群。【实例截图】【核心代码】android-flowlayout├── android-flowlayout│ ├── app│ │ ├── pom.xml│ │ └── src│ │ └── main│ │ ...

weixin_39967670的博客 276

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RBX寄存器与Windows x64调用约定:函数调用后局部变量为何不消失

在C/C++等高级语言中,局部变量生命周期看似由作用域决定;深入二进制层面,真正决定数据是否存续的是寄存器、栈帧与调用约定。Windows x64调用约定将寄存器分为易失与非易失,RBX作为典型非易失寄存器,由被调用方负责保存和恢复。编译器因此常把需要跨函数调用存活的变量放入RBX,配合调用者始终有效的栈帧,实现“调用后变量不消失”的底层保证。理解这一机制,对逆向分析、驱动开发、崩溃转储定位及性能优化都至关重要。本文通过反汇编示例与调试器操作,展示如何在实践中观察RBX不变性、识别函数序言保存模式,并厘清栈

weixin_33834628的博客 335

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

android 按钮换行_Android LinearLayout实现自动换行

由于前段时间项目中使用到了自动换行的线性布局,本来打算用表格布局在里面一个个的用Java代码添加ImageView的,但是添加的View控件是不确定的,因为得靠服务器的数据返回,就这样手动用Java代码画布局的方式就这样夭折了,因为在表哥布局中我无法确定一行显示多少个ImageView的数目,所以无法动态添加,最后自能自己去看看那种能够换行的线性布局了,线性布局比较不好的是不能自动换行,也就是当设...

weixin_39788792的博客 762

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android——自定义LinearLayout自动换行,TextView垂直排列。

自定义线性布局在xml中自定换行,比如你在项目中用到LinearLayout,设置水平排列android:orientation=”horizontal”,包裹button或者是TextView,但是不同分辨率的手机,不知道一行能放多少个Button,所以要使用到自动换行的LinearLayout,不多说,贴代码:package com.ds.platform.view;import android

Minor昔年 6832
上一篇: 淘宝架构框架
下一篇: redis密码管理
codepython
博客等级 码龄20年 125粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值