PS:转载请注明出处,谢谢

最近在项目里面有几个需要根据返回的数据来自动添加控件的地方,在网上找了一些,然后加上自己写的一些,都一起整理完,然后给自己做个备注,啦啦啦啦啦啦~~~~

先贴一张镇楼效果图(效果图不是很清晰,将就看了)

静态的也来一张

PS:里面主要写了三种样式(不够的话可以自己写View替换),这里代码就只展示第一种类型(太多了也展示不了,嘿嘿(关键是我想要分)),贴的代码里面都有注解的,我就不写了~~~~懒。

  1. HorizontalScollTabHost.java自定义功能
/*** Created by $USER_NAME on 2018/8/9 0009.* author : tomz  email:ibepend@126.com* 滑动添加的控件*/
public class HorizontalScollTabHost extends LinearLayout implements ViewPager.OnPageChangeListener {private final static String TAG = "HorizontalScollTabHost";private Context mContext;private int mBgColor;private int mTextSize;private List<String> list;private List<Fragment> fragmentList;private List<TextView> topViews;private int count;private LinearLayout mMenuLayout;private HorizontalScrollView hscrollview;private ViewPager viewpager;public HorizontalScollTabHost(Context context) {this(context, null);}public HorizontalScollTabHost(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public HorizontalScollTabHost(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);this.mContext = context;init(context, attrs);}/*** 初始化自定义属性和view** @param context* @param attrs*/private void init(Context context, AttributeSet attrs) {TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HorizontalScollTabhost);mBgColor = typedArray.getColor(R.styleable.HorizontalScollTabhost_top_background, 0x20999999);mTextSize = (int) typedArray.getDimension(R.styleable.HorizontalScollTabhost_textSize, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12, getResources().getDisplayMetrics()));typedArray.recycle();initView();}/*** 初始化view*/private void initView() {View view = LayoutInflater.from(mContext).inflate(R.layout.horizontal_scroll_tabhost, this, true);hscrollview = (HorizontalScrollView) view.findViewById(R.id.horizontalScrollView);viewpager = (ViewPager) view.findViewById(R.id.viewpager_fragment);viewpager.addOnPageChangeListener(this);mMenuLayout = (LinearLayout) view.findViewById(R.id.layout_menu);}/*** 供调用者调用,保证数据独立** @param list* @param fragments*/public void diaplay(List<String> list, List<Fragment> fragments, Handler handler) {this.list = list;this.count = list.size();this.fragmentList = fragments;this.mHandler = handler;topViews = new ArrayList<>(count);drawUi();}public void diaplay(List<String> list, Handler handler) {this.list = list;this.count = list.size();this.mHandler = handler;topViews = new ArrayList<>(count);drawUi();}public void diaplay(List<String> list) {this.list = list;this.count = list.size();topViews = new ArrayList<>(count);drawUi();}/*** 绘制页面所有元素*/private void drawUi() {drawHorizontal();}boolean isFalst = false;TextView[] textViews;int finalI;private Bundle bundle;private final int SELCT_SUCCESS = 0x00123;private Handler mHandler;private int typeId = 0;private List<Integer> listNum = new ArrayList<Integer>();/*** 绘制横向滑动菜单*/private void drawHorizontal() {
//        mMenuLayout.setBackgroundColor(mBgColor);textViews = new TextView[count];for (int i = 0; i < count; i++) {final String menu = list.get(i);final TextView tv = (TextView) View.inflate(mContext, R.layout.news_top_tv_item, null);textViews[i] = tv;//这行代码很重要,textViews[i].setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize);
//            textViews[i].setTextSize(15);textViews[i].setText(menu + " ");textViews[i].setTag(i);finalI = i;LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);lp.setMargins(15, 10, 0, 10);tv.setLayoutParams(lp);mMenuLayout.addView(tv);topViews.add(tv);}for (int j = 0; j < textViews.length; j++) {textViews[j].setTag(textViews);textViews[j].setOnClickListener(new LableClickListener());}//默认设置第一项为选中(news_top_tv_item.xml里面, android:textColor引用 drawable的selector)topViews.get(0).setSelected(true);textViews[0].setBackgroundResource(R.drawable.shape_border_nor);textViews[0].setTextColor(Color.parseColor("#E95D5C"));}/*** 这个是点击返回当前信息*/class LableClickListener implements View.OnClickListener {public LableClickListener() {}@Overridepublic void onClick(View v) {TextView[] textViews = (TextView[]) v.getTag();TextView tv = (TextView) v;for (int i = 0; i < textViews.length; i++) {//让点击的标签背景变成橙色,字体颜色变为白色if (tv.equals(textViews[i])) {textViews[i].setBackgroundResource(R.drawable.shape_border_nor);textViews[i].setTextColor(Color.parseColor("#E95D5C"));Toast.makeText(mContext, tv.getText().toString() + "", Toast.LENGTH_SHORT).show();//传递属性选择后的商品数据
//                    Message message = new Message();
//                    bundle = new Bundle();
//                    bundle.putString("type_name", tv.getText().toString());
//                    message.setData(bundle);
//                    message.what = SELCT_SUCCESS;
//                    mHandler.sendMessage(message);} else {//其他标签背景变成白色,字体颜色为黑色textViews[i].setBackgroundResource(R.drawable.shape_border_select);textViews[i].setTextColor(Color.parseColor("#666666"));}}//点击移动到当前fragmentviewpager.setCurrentItem(finalI);//点击让文字居中moveItemToCenter(tv);}}/*** 移动view对象到中间** @param tv*/private void moveItemToCenter(TextView tv) {DisplayMetrics dm = getResources().getDisplayMetrics();int screenWidth = dm.widthPixels;int[] locations = new int[2];tv.getLocationInWindow(locations);int rbWidth = tv.getWidth();hscrollview.smoothScrollBy((locations[0] + rbWidth / 2 - screenWidth / 2),0);}@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}@Overridepublic void onPageSelected(int position) {if (mMenuLayout != null && mMenuLayout.getChildCount() > 0) {for (int i = 0; i < mMenuLayout.getChildCount(); i++) {if (i == position) {mMenuLayout.getChildAt(i).setSelected(true);} else {mMenuLayout.getChildAt(i).setSelected(false);}}}//移动view,水平居中moveItemToCenter(topViews.get(position));}@Overridepublic void onPageScrollStateChanged(int state) {}}

主要的控件生成代码和滑动居中就已经完成了,剩下的就是用法了

2. MainActivity.java实现功能效果

public class MainActivity extends AppCompatActivity {private final static String TAG = "MainActivity";private HorizontalScollTabHost tabHost;private List<String> mList;private String strTiele[] = new String[]{"头条", "推荐", "关注", "视频", "Java SE", "Android", "Html5", "我不喜欢"};private static String[] testName = {"日历", "360", "三国", "消除", "播放器","游戏", "清理大师", "跑酷", "壁纸", "单机斗地主","捕鱼达人3", "雷电2014(雷霆版)", "打车", "输入法"};private String title;//private WarpLinearLayout warpLinearLayout;private Button btn;private AutoLayoutView layoutView;private List<AutoData> dataList;private String autoName[] = new String[]{"降龙", "黯然", "左右", "七十", "拈花", "蛤蟆", "吸星", "打狗", "醉拳"};
//    String atuoUrl[]=new String[]{""};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tabHost = findViewById(R.id.tabhost);mList = new ArrayList<>();for (int i = 0; i < strTiele.length; i++) {mList.add(strTiele[i]);}tabHost.diaplay(mList);initWarpData();initAutoIcon();}private void initWarpData() {btn = (Button) findViewById(R.id.btn);warpLinearLayout = (WarpLinearLayout) findViewById(R.id.warpLinearLayout);for (int j = 0; j < 11; j++) {int n = new Random().nextInt(10) + 5;StringBuffer stringBuffer = new StringBuffer();Random random = new Random();Log.i(TAG, "n=" + n);for (int i = 0; i < n; i++) {stringBuffer.append((char) (65 + random.nextInt(26)));Log.i(TAG, "StringBuffer=" + stringBuffer.toString());}final TextView tv = new TextView(MainActivity.this);tv.setText(stringBuffer.toString() + "000");tv.setBackgroundResource(R.drawable.shape_text_border);tv.setTextColor(getResources().getColor(R.color.black));tv.setPadding(10, 10, 10, 10);warpLinearLayout.addView(tv);tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "$ - " + tv.getText().toString() + " - $", Toast.LENGTH_SHORT).show();}});}/*** 单个添加*//*btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {int n = new Random().nextInt(10) + 5;StringBuffer stringBuffer = new StringBuffer();Random random = new Random();for (int i = 0; i < n; i++) {stringBuffer.append((char) (65 + random.nextInt(26)));}TextView tv = new TextView(MainActivity.this);tv.setText(stringBuffer.toString() + "000");tv.setBackgroundResource(R.drawable.shape_text_border);tv.setPadding(10, 10, 10, 10);warpLinearLayout.addView(tv);}});*/}private void initAutoIcon() {layoutView = findViewById(R.id.autoView);dataList = new ArrayList<AutoData>();for (int i = 0; i < autoName.length; i++) {AutoData autoData = new AutoData();autoData.setName(autoName[i]);autoData.setUrl("http://qcloudimg.ichongxin.com/menuicon/qiguantubiao/yimiao.png");dataList.add(autoData);}layoutView.addData(dataList);layoutView.setOnFlowLayoutListener(new AutoLayoutView.FlowLayoutListener() {@Overridepublic void onItemClick(View view, int poition) {Toast.makeText(MainActivity.this, "--> " + dataList.get(poition).getName() + " <--", Toast.LENGTH_SHORT).show();}});}//    private final int SWITCH_PAGE = 0x00123;
//
//    Handler mHandler = new Handler() {
//        @Override
//        public void handleMessage(Message msg) {
//            super.handleMessage(msg);
//            switch (msg.what) {
//                case SWITCH_PAGE:
//                    //接收dialog点击以后得返回数据
//                    title = msg.getData().getString("type_name");
//                    Log.i(TAG, "handleMessage: " + title);
//                    break;
//            }
//        }
//    };
}

最后在贴上布局文件activity_main.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"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:gravity="center|left"android:text="滑动控件居中显示"android:textColor="#000" /><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#FFF"><com.auto.widget.view.HorizontalScollTabHostandroid:id="@+id/tabhost"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginRight="48dp"android:layout_marginTop="5dp" /><ImageViewandroid:id="@+id/mall_more_image"android:layout_width="45dp"android:layout_height="35dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginBottom="8dp"android:layout_marginTop="8dp"android:src="@mipmap/more" /></RelativeLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="自动换行显示控件(根据布局或者单个控件来显示)"android:textColor="#000" /><Buttonandroid:id="@+id/btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="add"android:textSize="20dp"android:visibility="gone" /><com.auto.widget.view.WarpLinearLayoutandroid:id="@+id/warpLinearLayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/btn"android:background="#FFF"android:padding="10dp"app:grivate="left"app:horizontal_Space="10dp"app:isFull="false"app:vertical_Space="10dp"></com.auto.widget.view.WarpLinearLayout><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="10dp"android:text="自动换行显示图标控件(同上)"android:textColor="#000" /><com.auto.widget.view.AutoLayoutViewandroid:id="@+id/autoView"android:layout_width="wrap_content"android:layout_height="wrap_content"></com.auto.widget.view.AutoLayoutView><Viewandroid:layout_width="match_parent"android:layout_height="20dp" /></LinearLayout></ScrollView>
</RelativeLayout>

第一个功能的全部代码就已经全部贴完了,最后附上下载链接:

CSDN(跪求有分的大佬下载这个,攒点分^_^):https://download.csdn.net/download/wjilikely/10596183

GitHub:https://github.com/wangjiand/AutoLayoutView-master

Android 自动换行添加控件相关推荐

  1. android动态添加控件在指定位置,Android 如何动态添加 View 并显示在指定位置。

    引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...

  2. Android 在布局容器中动态添加控件

    这里,通过一个小demo,就可以掌握在布局容器中动态添加控件,以动态添加Button控件为例,添加其他控件同样道理. 1.addView 添加控件到布局容器 2.removeView 在布局容器中删掉 ...

  3. Android使用ListView控件问题

    Android使用ListView控件问题: The application has stopped unexpectedly, please try again. 开发环境:android 1.6 ...

  4. 【按住你的心】——Android开发CheckBoxRadioButton控件的简单使用

    Android的控件很多,我们从最常用的一些控件学起,今天我们学习CheckBox和RadioButton. 首先,我们要在main.xml文件中添加控件: <?xml version=&quo ...

  5. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  6. 动态添加综合布局---动态添加控件及将某XML动态加入到Activity显示(续)

    前言:以前曾写过一篇关于动态生成控件的文章<动态添加控件及将某XML动态加入到Activity显示>,比较浅显,对于RelativeLayout的相关布局设置方法及相对布局与线性布局的混合 ...

  7. 动态添加控件及将某XML动态加入到Activity显示

    一.动态添加控件.设置参数 这个难度比较大,放在前面讲,用的也比较多,普通情况下,我们会提前把布局XML写好,然后对XML中的元素进行设置,但这种方法在有些情况下就显得不适合,比较聊天应用,比如帖子的 ...

  8. 004 Android之其他控件

    文章目录 ListView ListView常用属性 ListView基本使用 ListView动态插入数据 ListView实现图文混排 Adapter Adapter(适配器种类) 自定义Adap ...

  9. android 原理 组合控件_Android_组合方式自定义控件

    用组合的方式自定义一个导航栏,功能: 左边个back被点击时,用监听的方式告诉系统自己被点击了了:右边个back被点击时,进入下一个界面. a.png 在MainActivity中用代码实现: 定义一 ...

最新文章

  1. 来聊聊COCO数据集上两大霸榜模型-CBNet和DetectoRS
  2. c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
  3. 牛客网暑期ACM多校训练营(第五场)A-gap (二分答案)
  4. float 与 double、隐式类型转换、switch、重写与重载、Java 与 C++ 的区别、JRE or JDK
  5. 搜狐视频Redis私有云cachecloud开源了
  6. [luogu-P4299] 首都(并查集 + LCT动态维护树的重心 / 维护虚儿子信息)
  7. java 狗带风波_养狗风波作文
  8. PyTorch实战福利从入门到精通之六——线性回归
  9. 实战:基于OpenCV进行长时间曝光
  10. XWiki 6.3 M1 发布,Java 的 Wiki 系统
  11. cadz轴归零命令_CAD图形Z轴坐标归零方法
  12. 商用密码产品认证-安全电子门禁系统
  13. ubuntu16.04安装theano
  14. 计算几何相关的面试题
  15. php关闭notice_php怎么关闭notice警告
  16. 谈操作系统(linux内核)学习的重要性
  17. 2012情人节语录1
  18. 技能get:找到连接WIFI设备的IP地址
  19. Unity Mesh(一) 初步使用Mesh画平面图形
  20. 程序员笔试之猿辅导招聘2021 编程题收集整理(八)

热门文章

  1. 在VS2010下利用vue开发团队项目
  2. 【开发日常】【Makefile】编译时如何将警告(warning)视为错误(error)?
  3. 畅通工程1863(并查集)(WA的思考)
  4. chrome浏览器打开网址找不到服务器IP
  5. C语言零基础入门级数据类型+运算符+控制流+ASCII 码表+面试题【系统学习第二天】
  6. 腾讯云神笔低代码平台的申请没通过,只能等公测了
  7. 少儿计算机兴趣小组活动记录,小学美术兴趣小组活动记录-(一).doc
  8. 论文阅读【A multi-task attention tree neural net for stance classification and rumor veracity detection】
  9. 西安恒智小寨java_Java常用异常整理
  10. 几个不太常用,需要记录一下的Excel经验