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

一、前言

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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio ,你可以使用 Java 代码来创建并添加 EditText 组件,然后再设置其文本。具体步骤如下: 1. 打开你需要添加文本框的 Java 文件,比如 MainActivity.java。 2. 在 Java 代码创建 EditText 组件,示例如下: ``` EditText editText = new EditText(this); ``` 这里我们创建了一个新的 EditText 组件,并将其保存到一个名为 editText 的变量。注意,这里的 this 表示当前上下文,通常指的是当前 Activity。 3. 设置 EditText 组件布局参数,示例如下: ``` LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT ); editText.setLayoutParams(params); ``` 这里我们创建了一个名为 paramsLinearLayout.LayoutParams 对象,并将其设置为 MATCH_PARENT 宽度和 WRAP_CONTENT 高度。然后我们通过 setLayoutParams 方法将这些参数应用到 editText 组件上。 4. 添加 EditText 组件布局,示例如下: ``` LinearLayout layout = findViewById(R.id.layout); layout.addView(editText); ``` 这里我们首先通过 findViewById 方法获取了一个名为 layoutLinearLayout 组件,然后通过 addView 方法将 editText 组件添加到该布局。 5. 设置 EditText 组件的文本,示例如下: ``` editText.setText("新的文本"); ``` 这里我们直接调用 setText 方法将 editText 组件的文本设置为 "新的文本"。 注意:在创建和修改组件时,请确保在组件加载完成后再进行操作,否则可能会导致空指针异常。你可以在 Activity 的 onCreate 方法进行操作,或者通过监听组件的加载状态来进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值