android的layout_android:layout_weight

android的layout_android:layout_weight一、前期基础知识储备首先看几个使用LayoutParams的实例:1、《Android开发艺术探索》第8章,Java代码中动态设置按钮时通过LayoutParams参数设置按钮位置x、y参数及Gravity位置信息,从而动态的添加进一个随手势移动的按钮,类似于悬浮窗效果。publicvoidonButtonClick(Viewview){if…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

android的layout_android:layout_weight

一、前期基础知识储备

首先看几个使用LayoutParams的实例:

1、《Android开发艺术探索》第8章,Java代码中动态设置按钮时 通过LayoutParams参数设置按钮位置x、y参数 及Gravity位置信息,从而动态的添加进一个随手势移动的按钮,类似于悬浮窗效果。

    public void onButtonClick(View view) {
        if (view == btnTest1) {
            btnTest = new Button(this);
            btnTest.setText("滑动按钮");
			
            layoutParams = new WindowManager.LayoutParams(
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    0, 0,//0,0 分别是type和flags参数,在后面分别配置了
                    PixelFormat.TRANSPARENT);
            layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
            //申明以下type时 需要申请权限android.permission.SYSTEM_ALERT_WINDOW
            layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR;
			
            layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
            layoutParams.x = 100;
            layoutParams.y = 300;
            windowManager.addView(btnTest2, layoutParams);
            btnTest.setOnTouchListener(this);
        }
    }

2、《Android开发艺术探索》第3章,通过设置LayoutParams参数实现控件的滑动。

	MarginLayoutParams params = (MarginLayoutParams) mButton.getLayoutParams();
	params += 100;
	params.leftParams += 100; //实现按钮控件往左滑动100px
	mButton.requestLayout();
	//mButton.setLayoutParams(params);
        mPrimeViewPager = (ViewPager) view.findViewById(R.id.prime_viewPager);
        LinearLayout.LayoutParams viewPager_lp = (LinearLayout.LayoutParams)mPrimeViewPager.getLayoutParams();
        viewPager_lp.width = (int) (ScreenUtils.getScreenWidth() * 0.57);
        viewPager_lp.height = viewPager_lp.width * 16 / 9;
        mPrimeViewPager.setLayoutParams(viewPager_lp);

注意:LayoutParams,每个view都需要一个LayoutParams,告诉父容器的一些放入规则和方式,这时候该view的LayoutParams要与父容器的LayoutParam相互对应,比如该view的父容器使用的LinearLayout.LayoutParam,该view的布局类型也要对应着LinearLayout.LayoutParam,不然的话回报类型转换错误.。或者也可以直接使用ViewGroup.MarginLayoutParams。

3、在笔者之前的文章《横向滑动视图HorizontalScrollView精炼详解》 有以下代码,为HorizontalScrollView中动态添加TextView,进行数据填充。

	private void bindHZSWData()  { 
        //为布局中textview设置好相关属性  
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,   
        ViewGroup.LayoutParams.WRAP_CONTENT);  
        lp.gravity = Gravity.CENTER;  
        lp.setMargins(20, 10, 20, 10);  
  
        for (int i = 0; i < data.size(); i++)  {
            TextView textView = new TextView(this);  
            textView.setText(data.get(i));  
            textView.setTextColor(Color.WHITE);
			
            textView.setLayoutParams(lp);  
            container.addView(textView);
			
            container.invalidate();    
        }  
    } 

4、实际开发中,笔者碰到自定义View时重写onMeasure()后改变View的布局时,view位置也要进行相应调整,所以写了一个方法,里面通过LayoutParams.Gravity= Gravity.CENTER,控制该view的位置为居中。

    public void setParams() {
        FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) getLayoutParams();
        lp.gravity = Gravity.CENTER;
        this.setLayoutParams(lp);
        this.invalidate();
    }

以上的例子都是利用LayoutParams类实现新view的添加或者已有view位置的调整。我们来看一下官方文档中对于这个类的描述。打开Android开发者文档,键入LayoutParams时会发现出来很多个和LayoutParams相关的类。本篇文章中,我们只关注ViewGroup.LayoutParams中的LayoutParams类。

android的layout_android:layout_weight

public static class ViewGroup.LayoutParamsextends Object.可以看到ViewGroup.LayoutParams是一个静态的直接继承自Object的类,那么可以判断其为基类,文档往下看,我们看到:

android的layout_android:layout_weight

果然,所有的LayoutParams类都是继承自ViewGroup.LayoutParams。其实ViewGroup.LayoutParams很好理解,这个类里面的成员变量最主要包括两个——width和height,对应在XML布局中的android:layout_height和android:layout_width,也就是所有的View控件都需要写入的两个属性。接着,笔者在截图中标注了四个具体的LayoutParams子类,这四个类在开发中是用到最多的。

二、上代码,具体使用LayoutParams类

(1)使用LayoutParams类动态创建新的布局元素

①定义一个XML布局,根布局为线性布局,布局中不放入任何控件;

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root_ll"
    tools:context="com.example.administrator.myviewtest.MainActivity">
	
    </LinearLayout>

②在Activity代码中动态的为整个布局增加一个TextView,要求对其属性进行设置;

private LinearLayout mLinearLayout;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mLinearLayout = (LinearLayout) findViewById(R.id.root_ll);

    //设置TextView的width和height 对应XML布局中的android:layout_width和android:layout_height属性
    //这里的ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT是作为构造方法的参数传入的
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    //设置TextView的gravity 对应于XML布局中layout_gravity
    lp.gravity = Gravity.CENTER_HORIZONTAL;
    //设置TextView的Margin属性,包括left、top、right、botom
    lp.setMargins(20,20,20,20);
    //新建TextView实例
    TextView textView = new TextView(this);
    textView.setText("Android cool");
    //为textView实例绑定创建好的LayoutParams
    textView.setLayoutParams(lp);
    //调用LinearLayout的addView方法 动态的
    mLinearLayout.addView(textView);
}

这里,我们以LinearLayout的LayoutParams实例为例,进行创建。

(2)使用LayoutParams类动态改变已有的布局元素的位置信息

①定义一个XML布局,根布局为线性布局,布局中加入一个基础的文本控件;

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/root_ll"
    tools:context="com.example.administrator.myviewtest.MainActivity">
	
    <--注意这里TextView是放在LinearLayout中的 所以待会取Params时使用的是LinearLayout的 -->
    <TextView
        android:id="@+id/textview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
		
    </LinearLayout>

 

②在Activity中利用LayoutParams类动态的改变基础文本控件的位置信息;

private LinearLayout mLinearLayout;
private TextView mTextView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mLinearLayout = (LinearLayout) findViewById(R.id.root_ll);
    mTextView = (TextView) findViewById(R.id.textview);
    //传入已有控件的LayoutParams信息作为LinearLayout.LayoutParams构造方法的参数
    //注意TextView的父容器是LinearLayout,所以使用的是LinearLayout.LayoutParams
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(mTextView.getLayoutParams());
    //设置已有文本控件位置为横向居中
    lp.gravity = Gravity.CENTER_HORIZONTAL;
    //设置已有文本空间的Margin
    lp.setMargins(60,60,60,60);

    mTextView.setText("nice Android");
    //将创建好的LayoutParams绑定到已有文本控件
    mTextView.setLayoutParams(lp);
}

 

可以看到,这里使用LayoutParams的方法是一样的,只是在创建LayoutParams实例的时候传入构造方法的参数不一样了,在已有控件的前提下,我们传入的是已有空间的LayoutParams信息。

(3)LayoutParams类的构造方法

android的layout_android:layout_weight

我们可以看见ViewGroup.LayoutParams的构造方法有三个(子类会多一个),我们在动态创建新View的时候,调用的是LayoutParams第二个构造方法,传入wrap_content或者match_parent常量或者固定值即可;在动态调整已有控件的位置信息时,我们调用的是LayoutParams的第三个构造方法,传入的参数是已有控件的LayoutParams的信息,利用view. getLayoutParams()即可获得。

 

总结:使用LayoutParams的最常见的两种场景就是文章中提到的两种:①动态创建新控件元素;②调整已有布局元素的位置信息,更难一点的用法出现在自定义View中,我们重写onMeasure()方法之后,通常需要对自定义view的位置进行新的调整,在这个过程中,我们不是通过onLayout()方法实现的(onLayout用于实现ViewGroup对其内部view重新布局时调用),而是使用设置自定义View的LayoutParams.gravity实现的,自定义View也是一个view,这里可以将这种LayoutParams的用法归为第二种-对已有控件的位置进行调整。

本文代码中是使用的LinearLayout.LayoutParams,实际开发中还可能使用到其他类型的LayoutParams,如开篇中,讲到的《Android开发艺术探索》中使用的就是WindowManager.LayoutParamsViewGroup.MarginLayoutParams,用法是类似的,但是各自可以设置的属性是不同的,比如,WindowManager.LayoutParams可以直接设置view的横纵坐标信息,直接控制view在屏幕中的显示位置;ViewGroup.MarginLayoutParams可以很方便的设置view各边的margin属性,可以用来实现滑动效果。感兴趣的读者可以到开发者文档中进行了解。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192888.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 单片机流水灯程序[通俗易懂]

    单片机流水灯程序[通俗易懂]一、流水灯实验1、设计要求P1口接8个发光二极管,烧录程序后发光二极管依次点亮2、硬件要求利用proteusIsis仿真,选择器件,AT89C51、LED-BLUE、RES3、软件设计源程序:/*********************必要变量定义******************/#include&lt;reg51.h&gt;#include&lt;intrns.h&gt;…

    2022年5月1日
    54
  • 电子设计教程12:Buck降压电路

    电子设计教程12:Buck降压电路  我们仍然使用MC34063芯片,来设计一个DC-DC降压电路,实现直流12V转5V。Buck变换器  Buck变换器是开关电源基本拓扑结构的一种,Buck变换器又称为降压变换器,是一种对输入电压进行降压变换的直流斩波器,其输出电压低于输入电压。  Buck变换器与Boost变换器使用的器件完全一样,只不过连接方式不太一样。Buck电路是正激类型,在开关管导通的时候,能量可以传递到输出端。…

    2022年6月20日
    37
  • kettle教程二

    kettle教程二转载:http://www.cnblogs.com/limengqiang/archive/2013/01/16/KettleApply2.html1、应用场景这里简单概括一下几种具体的应用场景,按网络环境划分主要包括:表视图模式:这种情况我们经常遇到,就是在同一网络环境下,我们对各种数据源的表数据进行抽取、过滤、清洗等,例如历史数据同步、异构系统数据交互、数据对称发布或备份等都归属于这…

    2022年5月23日
    61
  • 一比一还原axios源码(五)—— 拦截器「建议收藏」

    上一篇,我们扩展了Axios,构建了一个Axios类,然后通过这个Axios工厂类,创建真正的axios实例。那么今天,我们来实现下Axios的拦截器也就是interceptors。我们来简单看下Ax

    2022年3月25日
    38
  • lspci 指令_plsr指令

    lspci 指令_plsr指令1.指令名称lspci2.指令简介lspci是一个用于显示系统中所有PCI/PCIe总线及设备信息的工具。默认情况下,它只显示设备的最简要信息。通过传入指定参数,可以输出更详细的信息,或者可以按照特定格式输出,以便于用其他程序进行解析。有些PCI/PCIe的设备信息需要在root权限下才能获取到。3.参数先来看看不加任何参数时输出的结果。bryan@bryan-pc:~$lspci00:00.0Hostbridge:IntelCorporation8.

    2022年9月9日
    0
  • python fileinput_Python中fileinput模块

    python fileinput_Python中fileinput模块fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件readlines()方法,区别在于:前者是一个迭代对象,即每次只生成一行,需要用for循环迭代。后者是一次性读取所有行。在碰到大文件的读取时,前者无疑效率更高效。用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。【典型用法】importfileinputf…

    2022年6月6日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号