Android动态添加设置布局与控件的方法

本文实例讲述了Android动态添加设置布局与控件的方法。分享给大家供大家参考,具体如下:

有时候我们会在代码端,动态的设置,添加布局和控件。下面我们就看来看一下如何处理,直接上代码,代码里面的注解很清楚了。

布局文件:fragment_hot.xml

说明:这个部局,我用的是scrollView做为基础布局,主要是为了实现一个滚动。这里不多说,这个你可以使用任何布局都可以,这里的id我是提前定义的。

这里面的现在有的布局是我为了看到我在代码端,动态添加的代码,是否可以追加到现有布局的后面而加上,这里大家可以自己设置

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@id/id_stickynavlayout_innerscrollview"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <LinearLayout
    android:id="@+id/line_fragment_hot_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
      android:layout_width="fill_parent"
      android:layout_height="80dp"
      android:orientation="horizontal">
      <LinearLayout
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1">
        <ImageView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/desktop_device"/>
      </LinearLayout>
      <LinearLayout
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1"
        android:orientation="vertical">
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="燕郊孔雀城"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="燕郊 燕郊"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="3万抵6万"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="6000元/m"/>
      </LinearLayout>
      <LinearLayout
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1"
        android:gravity="right">
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="剩2天"
          android:textColor="#F97F49"
          android:textSize="12dp"
          android:textStyle="bold"
          android:layout_marginTop="2dp"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:background="@drawable/rectangle_radius_fen"
          android:gravity="center"
          android:text="团"
          android:textSize="9dp"
          android:textColor="#ffffff"
          android:layout_marginRight="5dp"
          android:layout_marginLeft="2dp"/>
      </LinearLayout>
    </LinearLayout>
    <LinearLayout
      android:layout_width="fill_parent"
      android:layout_height="80dp"
      android:orientation="horizontal">
      <LinearLayout
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1">
        <ImageView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:src="@drawable/desktop_device"/>
      </LinearLayout>
      <LinearLayout
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1"
        android:orientation="vertical">
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="燕郊孔雀城"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="燕郊 燕郊"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="3万抵6万"/>
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="6000元/m"/>
      </LinearLayout>
      <LinearLayout
        android:layout_width="0dp"
        android:layout_height="70dp"
        android:layout_weight="1"
        android:gravity="right">
        <TextView
          android:layout_width="wrap_content"
          android:layout_height="20dp"
          android:text="剩2天"/>
        <TextView
          android:layout_width="10dp"
          android:layout_height="10dp"
          android:background="@drawable/rectangle_radius_fen"
          android:gravity="center"
          android:text="团"
          android:textSize="5dp"
          android:layout_marginRight="5dp"/>
      </LinearLayout>
    </LinearLayout>
  </LinearLayout>
</ScrollView>

一个背景图文件在drawable文件夹中

rectangle_radius_fen.xml

说明:很简单,就是设置一个有圆角的方形

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
  android:shape="rectangle" >
  <!-- 定义填充渐变颜色 -->
  <solid android:color="#F97F49"/>
  <!-- 设置内填充 -->
  <padding android:left="1dp"
    android:top="1dp"
    android:right="1dp"
    android:bottom="1dp"/>
  <!-- 设置圆角矩形 -->
  <corners android:radius="2dp"/>
</shape>

后台代码:

fragment_hot.java

说明:这里不多说了,里面的注解很明确了

package com.example.cg.fangduo;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
/**
 * A simple {@link Fragment} subclass.
 */
public class fragment_hot extends Fragment {
  //定义当前页面
  private View view;
  private LinearLayout line_fragment_hot_main;
  private ScrollView id_stickynavlayout_innerscrollview;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
               Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_hot, container, false);
    id_stickynavlayout_innerscrollview = (ScrollView)view.findViewById(R.id.id_stickynavlayout_innerscrollview);
    line_fragment_hot_main = (LinearLayout)view.findViewById(R.id.line_fragment_hot_main);
    for(int i=0;i<10;i++) {
      /**
       * 设置每个item最外层的LinearLayout
       */
      LinearLayout itemMain = new LinearLayout(getActivity());
      itemMain.setOrientation(LinearLayout.HORIZONTAL); //设置linearLayout是横向还是竖各
      LinearLayout.LayoutParams itemMainparams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dip2px(getActivity(), 80)); //设置宽与高
      itemMainparams.setMargins(0,dip2px(getActivity(),1),0,0); //设置每个item与上一个控件的间隔是1dip
      itemMain.setLayoutParams(itemMainparams);
      itemMain.setBackgroundColor(Color.WHITE); //设置背景色
      itemMain.setVerticalGravity(Gravity.CENTER); //设置对齐方式
      /**
       * 设置左侧图片LinearLayout
       */
      LinearLayout itempic = new LinearLayout(getActivity());
      itempic.setOrientation(LinearLayout.HORIZONTAL);
      LinearLayout.LayoutParams itempicparams = new LinearLayout.LayoutParams(0, dip2px(getActivity(), 70), 1);
      itempic.setLayoutParams(itempicparams);
      itempic.setVerticalGravity(Gravity.CENTER_VERTICAL);
      /**
       * 设置图片
       */
      ImageView imgPic = new ImageView(getActivity());
      imgPic.setImageResource(R.drawable.desktop_device);
      LinearLayout.LayoutParams imgPicparams = new LinearLayout.LayoutParams(dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT), dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT));
      imgPicparams.leftMargin = dip2px(getActivity(), 5);
      imgPicparams.gravity = Gravity.LEFT;  //必须要加上这句,setMargins才会起作用,而且此句还必须在setMargins下面
      imgPic.setLayoutParams(imgPicparams);
      /**
       * 图片LinearLayout加载图片
       */
      itempic.addView(imgPic, imgPicparams);
      /**
       * 向主LinearLayout加载图片LinearLayout
       */
      itemMain.addView(itempic);
      /**
       * 设置中间文字显示LinearLayout
       */
      LinearLayout itemtext = new LinearLayout(getActivity());
      itemtext.setOrientation(LinearLayout.VERTICAL);
      LinearLayout.LayoutParams itemtextparams = new LinearLayout.LayoutParams(0, dip2px(getActivity(), 70), 1);
      itemtext.setLayoutParams(itemtextparams);
      itemtext.setVerticalGravity(Gravity.CENTER_VERTICAL);
      TextView txtOne = new TextView(getActivity());
      txtOne.setText("珠江俊景小区");
      txtOne.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 12); //设置字号,并且设置它的单位为dip
      txtOne.getPaint().setFakeBoldText(true); //字体加租
      LinearLayout.LayoutParams txtOneparams = new LinearLayout.LayoutParams(dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT), dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT));
      txtOneparams.weight = 1;
      txtOneparams.setMargins(0, 0, 0, 0);
      txtOneparams.gravity = Gravity.LEFT;
      txtOne.setLayoutParams(txtOneparams);
      itemtext.addView(txtOne);
      TextView txtTwo = new TextView(getActivity());
      txtTwo.setText("哈尔滨");
      txtTwo.getPaint().setFakeBoldText(true);
      txtTwo.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 8);
      LinearLayout.LayoutParams txtTwoparams = new LinearLayout.LayoutParams(dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT), dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT));
      txtTwoparams.weight = 1;
      txtTwo.setLayoutParams(txtTwoparams);
      itemtext.addView(txtTwo);
      TextView txtThree = new TextView(getActivity());
      txtThree.setText("一万抵五万");
      txtThree.getPaint().setFakeBoldText(true);
      txtThree.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 8);
      txtThree.setLayoutParams(txtOneparams);
      itemtext.addView(txtThree);
      TextView txtFour = new TextView(getActivity());
      txtFour.setText("8000元/m");
      txtFour.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10);
      txtFour.setTextColor(Color.parseColor("#F97F49"));
      txtFour.getPaint().setFakeBoldText(true);
      txtFour.setLayoutParams(txtOneparams);
      itemtext.addView(txtFour);
      itemMain.addView(itemtext);
      /**
       * 定义右侧显示信息框架
       */
      LinearLayout line_right_text = new LinearLayout(getActivity());
      line_right_text.setOrientation(LinearLayout.HORIZONTAL);
      LinearLayout.LayoutParams rightparams = new LinearLayout.LayoutParams(0, dip2px(getActivity(), 70), 1);
      line_right_text.setLayoutParams(rightparams);
      line_right_text.setGravity(Gravity.RIGHT);  //右对齐
      TextView daytxt = new TextView(getActivity());
      LinearLayout.LayoutParams daytxtparams = new LinearLayout.LayoutParams(dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT), dip2px(getActivity(), ViewGroup.LayoutParams.WRAP_CONTENT));
      daytxt.setLayoutParams(daytxtparams);
      daytxt.setText("剩2天");
      daytxt.setTextColor(Color.parseColor("#F97F49")); //设置颜色
      daytxt.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10); //设置文字大小
      daytxt.getPaint().setFakeBoldText(true); //设置文字样式,加粗
      //daytxt.setPadding(0,2,2,0);
      line_right_text.addView(daytxt);
      TextView tuantxt = new TextView(getActivity());
      LinearLayout.LayoutParams tuantxtparams = new LinearLayout.LayoutParams(dip2px(getActivity(), 12), dip2px(getActivity(), 12));
      tuantxtparams.setMargins(dip2px(getActivity(), 2), dip2px(getActivity(), 0), dip2px(getActivity(), 5), 0);
      tuantxt.setLayoutParams(tuantxtparams);
      tuantxt.setBackgroundResource(R.drawable.rectangle_radius_fen);  //设置textView背景图片
      tuantxt.setGravity(Gravity.CENTER);
      tuantxt.setText("团");
      txtFour.getPaint().setFakeBoldText(true);
      tuantxt.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 8);
      tuantxt.setTextColor(Color.parseColor("#ffffff"));
      line_right_text.addView(tuantxt);
      itemMain.addView(line_right_text);
      line_fragment_hot_main.addView(itemMain);
    }
    return view;
  }
  /**
   * 设备像素(dip,dp)转屏幕像素(px)
   * px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
       * 而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。
   * @param context
   * @param dipValue
   * @return
   */
  public static int dip2px(Context context, float dipValue){
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int)(dipValue * scale + 0.5f);
  }
  /**
   * 将px值转换为sp值,保证文字大小不变
   *
   * @param pxValue
   * @param pxValue
   *      (DisplayMetrics类中属性scaledDensity)
   * @return
   */
  public static int px2sp(Context context, float pxValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (pxValue / fontScale + 0.5f);
  }
  /**
   * 将sp值转换为px值,保证文字大小不变
   *
   * @param spValue
   * @param spValue
   *      (DisplayMetrics类中属性scaledDensity)
   * @return
   */
  public static int sp2px(Context context, float spValue) {
    final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
    return (int) (spValue * fontScale + 0.5f);
  }
}

效果图:

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android 仿京东商城底部布局的选择效果(Selector 选择器的实现)

    京东商城的底部布局的选择效果看上去很复杂,其实很简单,这主要是要感谢 selector 选择器,本文将讲解仿照京东商城的底部布局的选择效果,如何实现 selector 选择器,在不同的状态下,给 view 设置不同的背景. 京东商城底部布局的选择效果如下. View主要的几种状态 主要状态有8种,设置状态的代码以及相应的含义如下. android:state_pressed = "true/false" //true表示按下状态,false表示非按下状态. android:state_

  • Android 组合控件实现布局的复用的方法

    看到很多项目会有实现自己的标题栏的做法,通常的界面是左边按钮或文字,加上中间的标题和右边的按钮或文字组成的.比较好的一种做法是使用include标签,复用同一个xml文件来实现布局的复用.但是这种方法是通过代码的方式来设置标题,左右按钮等其他的属性,会导致布局属性和Activity代码耦合性比较高. 因此,我们要通过自定义View,继承ViewGroup子类来实现这样的布局,降低布局文件和Activity代码耦合性. 首先,我们需要写出布局文件layout_custom_titlebar.xml

  • Android开发之基本控件和四种布局方式详解

    Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

  • Android布局控件之常用linearlayout布局

    LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失.因此一个垂直列表的每一行只会有一个widget或者是container,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子控件的高度加上边框高度).LinearLayout保持其所包含的widget或者是container之间的间隔以及互相对齐(相对一个控件的右对齐.中间对齐或者左对齐). xml属性

  • Android时间选择器、日期选择器实现代码

    本文为大家分享了两款选择器,一款可以针对时间进行选择.一款可以针对日期进行选择,供大家参考,具体内容如下 一.时间选择器 1.1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.and

  • Android布局优化之ViewStub控件

    ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法.当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点: 1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控

  • Android编程布局控件之AbsoluteLayout用法实例分析

    本文实例讲述了Android编程布局控件之AbsoluteLayout用法.分享给大家供大家参考,具体如下: AbsoluteLayout是绝对布局管理器,指的是指定组件的左上角绝对坐标来指定组件的布局 <?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"

  • Android 布局控件之LinearLayout详细介绍

    LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失.因此一个垂直列表的每一行只会有一个widget或者是container,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子控件的高度加上边框高度).LinearLayout保持其所包含的widget或者是container之间的间隔以及互相对齐(相对一个控件的右对齐.中间对齐或者左对齐). API说明

  • Android 图片网格布局控件示例代码

    项目地址:MultiPictureView MultiPictureView是一个可以将多张图片以网格的方式显示的View,通过简单的接口实现烦人的布局,从此解放你的小手手 显示效果 支持设置图片数量上限 支持设置最多显示列数 支持动态布局和静态布局两种模式(见下图) 支持编辑模式和展示模式(编辑模式可以增加和删除图片) 布局方式 动态布局 静态布局 编辑/显示模式 如何使用 1. 在布局中声明 <com.goyourfly.multi_picture.MultiPictureView andr

  • Android开发实现布局中为控件添加选择器的方法

    本文实例讲述了Android开发实现布局中为控件添加选择器的方法.分享给大家供大家参考,具体如下: 在开发过程中,动态交互的一些展示效果可以通过布局中添加选择器实现,这样就可减少Activity等的代码数量,MVP开发中降低耦合性,使开发人员在写代码时只需要关注逻辑处理. 比如:一个按钮,原本背景图片为红色,字体为黑色,点击时候背景图片为黄色,字体改为白色. 这类简单效果在布局时就可以实现: <Button android:id="@+id/btn_start" android:

随机推荐