android在java代码中动态添加组件及相关布局方法(LayoutParams)

原创 2015年11月18日 17:05:56

一、前言

Android的界面布局可以用两种方法,一种是在xml中布局,一种是在JAVA代码中实现界面的布局。前者布局是很方便的,但是对于需要动态的显示界面,这个时候xml就缺少了一种灵活性。有一个需求:针对listView或者RecyclerView进行下拉刷新和上拉加载更多的时候,我们页面需要安卓qq那种:下拉刷新的listView或者RecyclerView上面嵌上一个搜索框。

亲,刷新试试

项目中这个地方用的是listView,因此最简单的方法可能就是在为组件绑定adapter之前,使用listView的addHeadView方法动态添加一个组件。

值得注意的是:addHeadView必须在为组件绑定adapter之前

二、java代码使用布局

1.

 TextView myTextView = new TextView(this);
        myTextView.setText("我是搜索框");
        myTextView.setTextSize(15);
        myTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        listView.addHeaderView(myTextView);

1.但是报错LinearLayout.LayoutParams不能转换为AbsListView.LayoutParams,当时写成 LinearLayout.LayoutParams就是凭感觉猜的。
2. 一般的布局比如 LinearLayout和RelativeLayout代码中布局除了setLayoutParams还有一种方法void addView(View, LayoutParams)

于是将LinearLayout.LayoutParams改成AbsListView.LayoutParams,但是发现后者只有构造函数中只有两个参数,分别是width和height。这样从运行结果来看这个textview只能靠在左边。我要的效果是该textview在listview的item中居中,就像上面的那幅图片中搜索那样。


  1. 由于使用了listView的原因,我们LayoutParams只能是AbsListView.LayoutParams。对组件设置AbsListView.LayoutParams只有构造参数中提供的宽高,这是无法自由布局的。比如控制居中。
    我们可以换个思路。我们在放入listView的item变成TextView外面套一层布局。在该布局(search_refresh_layout.xml)中我们可以自由控制TextView的显示:居中、padding之类的。对该布局设置AbsListView.LayoutParams: rl_tv_search.setLayoutParams(params);就ok了。代码如下:
      ViewGroup rl_tv_search = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.search_refresh_layout,null);
        AbsListView.LayoutParams params = new AbsListView.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
        rl_tv_search.setLayoutParams(params);
        listView.addHeaderView(rl_tv_search);
        listView.setAdapter(adapter);

其中search_refresh_layout.xml中

<?xml version="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">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        android:text="我是搜索框"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

效果图如下:
亲,刷新试试

之前的这个我是搜索框是靠左边的,现在居中

三、总结

  1. java代码中两种设置布局的方法,一种是setLayoutParams,另外一种是addView(View, LayoutParams)前者是通用的,后者是ViewGroup才有的,因为addView吗只有group才可以。
  2. listView的addHeadView方法必须在为组件绑定adapter之前
  3. lsitView添加的头部自由布局还是嵌套一层LinearLayout之类的布局,比较方便。

列表越来越多使用RecyclerView替换listView了,至于如何使用recyclerView添加头部,请参考
1. http://www.open-open.com/lib/view/open1434423117989.html
2. http://blog.csdn.net/jxxfzgy/article/details/47012097

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android: 静态XML和动态加载XML混合使用,以及重写Layout控件

近期对android里面控件修改做了很多实验,由于公司需求很多,不得不重写很多控件。程序目标无非是:高效、轻巧、清晰、标准化 完成动态加载Layout有两种方法,依据个人喜好进行选择: 方法1:静态主...

android:代码中动态添加子布局

在应用中有时候需要通过某些点击效果动态地添加布局,而不是直接加载完整的xml布局文件,这时就可以在代码中实现。

android 通过代码改变控件的布局方式

在很多情况下当我们在xml中布局的方式并不能满足我们的要求,而这时我们就需要通过在代码中控制控件的布局 根据不同的条件来控制布局。首先来了解一下安卓中的一些单位 dip: device indep...

Android 在.java文件中添加新的控件到界面上

当不用.xml文件定义控件,想直接在.java文件中new一个空间让后稍微设置一下放到界面上时可以用下面方法 eg: Button button = new Button(this); button....

android使用java代码创建控件、布局

一个在LinearLayout下的控件生成方法 (若是在RelationLayout下将LinearLayout.LayoutParams改为RelationLayout.LayoutParams...

Android 中使用代码动态网格布局

Android 中使用代码动态布局 本文介绍在android中使用代码动态布局,有时候根据不同的需求,比如需要根据服务器上的条目个数来决定app中页面布局控件(显示个数,图标等)。此处介绍通过ja...

android动态加载(添加)布局

最近项目中需要动态的添加布局,查了网上的一些方法,自己总结了一下,android中动态加载布局主要是找准父布局,注意父布局的样式,是linearlayout或者是其他。 代码如下: 父布局,其中定...

Android 动态生成复杂的布局(View布局的子控件含自己的点击事件)

有时候会遇到一些工作计划的需求,大多数工作计划都会有统一的模板,即计划内容分类是一致的。 比如说周计划管理:每周都有7天,对于我们来说就会有两个方案:1、画7个相同布局 2、动态生成7个布局 之前有想...

Android 动态解析布局,实现制作多套主题

之前做过一个项目(随心壁纸),主要展示过去每期的壁纸主题以及相应的壁纸,而且策划要求,最好可以动态变换主题呈现方式,这样用户体验会比较好。嗯,好吧,策划的话,咱们也没法反驳,毕竟这样搞,确实很不错。于...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)