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

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

使用JAVA代码实现Android布局(一)RelativeLayout

通常我们使用XML来书写Android的图形界面,XML虽然编写方便,但是在某些情况下不如JAVA代码灵活,所以在某些环境下还是必须使用JAVA代码来编写界面。我们以下XML代码为例,编写相应的JAV...
  • u010712277
  • u010712277
  • 2016年01月03日 19:14
  • 3210

JAVA语言在窗体中动态添加按钮组件并重绘jpanel面板

有时候我们会用到动态添加组件的情况。可以根据人们需要的组件以及组件个数来动态添加。 尝试了多次,在此记录一下,如果有什么不对或者更好的方案,还请大家赐教。 代码如下: import java.awt....
  • without_scruple
  • without_scruple
  • 2017年11月26日 10:06
  • 410

Android在布局中动态添加view的两种方法

一、说明 添加视图文件的时候有两种方式:1、通过在xml文件定义layout;2、java代码编写二、前言说明1.构造xml文件2.LayoutInflater提到addview,首先要了解一下La...
  • Xd_Yu
  • Xd_Yu
  • 2016年05月19日 17:30
  • 18279

Android 动态添加布局(layout)和控件(Widget)

众所周知写Android程序的页面布局是通过activity绑定xml文件中事先定义好的文件来实现的,这种实现方式叫做静态布局。但有时无法在程序运行前就决定好页面的布局,或者是控件的属性和数量本身要求...
  • mottled233
  • mottled233
  • 2016年08月10日 15:22
  • 3586

Android中的基础-----如何使用JAVA动态的添加并设置组件属性

使用Java代码可以动态添加 并设置所有组件属性。(需要LayoutParams.addRule方法来设置属性,然后调用View.setLayoutParams方法更新View) 示例:(动态添加B...
  • Emira_J
  • Emira_J
  • 2016年07月13日 11:26
  • 1076

Android 用纯代码实现复杂界面

在开发Android应用时有时会遇到纯代码实现复杂界面的需求,本文通过实例来演示,希望能对大家有所帮助 界面截图:   XML布局文件: ...
  • gf771115
  • gf771115
  • 2012年11月29日 09:49
  • 28321

java动态添加控件布局

网上有很多动态添加控件布局等,但是都比较残缺。本人也在网上找的苦逼,这里把我自己写的代码贴上,希望跟我一起找着方面的同道有个快捷的实现方式。  /**      * 2017.3.27     ...
  • lvuchenliu
  • lvuchenliu
  • 2017年03月28日 16:29
  • 683

Listview中动态添加另外一种布局

listview在现有数据中动态添加另外一种布局,通过getViewType区分开position。根据返回的值,加载不同的布局,实现两种布局。注意getcout等于源数据集合中的总数加上插入的新数据...
  • yujiugang
  • yujiugang
  • 2016年06月16日 19:23
  • 4028

Android View视图------Android如何创建一个view。

View是所有控件的一个基类,无论是布局(Layout),还是控件(Widget)都是继承自View类。只不过layout是一个特殊的view,它里面创建一个view的数组可以包含其他的view而已。...
  • linghu_java
  • linghu_java
  • 2013年11月04日 18:01
  • 18927

java代码添加view

package com.example.demo;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; ...
  • Sindyue
  • Sindyue
  • 2016年06月14日 18:08
  • 894
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android在java代码中动态添加组件及相关布局方法(LayoutParams)
举报原因:
原因补充:

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