Android ViewGroup

时间:2020-02-23 14:29:23  来源:igfitidea点击:

Android ViewGroup类用于创建屏幕视图。
在本教程中,我们将学习ViewGroup并查看一些简单的示例。

什么是Android ViewGroup?

ViewGroup是用于保存视图的容器。
所有的android活动,片段布局等都是ViewGroups。

ViewGroup类是从Views扩展的。
它们用作android应用程序屏幕上的容器。

Android ViewGroup的类型

Android中一些重要的ViewGroup是:

  • 线性布局
  • 相对布局
  • 框架布局
  • 表格布局
  • 协调器布局
  • ConstraintLayout

这些类的名称以" Layout"结尾,因为它们用于创建不同类型的布局。

让我们看一下Android应用程序中ViewGroups的一些示例。

1. LinearLayout

LinearLayout是一个ViewGroup,它在一个方向(垂直或者水平)上对齐其所有子视图。

android:orientation属性用于在XML布局中设置方向。

1.1)水平LinearLayout XML代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@android:color/holo_green_light"
      android:text="Button 1" 

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Button 2" 

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@android:color/holo_purple"
      android:text="Button 1" 

</LinearLayout>

默认情况下,方向是水平的,重力保持对齐。

1.2)垂直LinearLayout XML代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:orientation="vertical"
  android:gravity="end"
  android:layout_height="match_parent">

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@android:color/holo_green_light"
      android:text="Button 1" 

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Button 2" 

  <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:background="@android:color/holo_purple"
      android:text="Button 1" 

</LinearLayout>

重力值" end"代表"正确"对齐。
我们可以互换使用值" right"或者" end"。

同样,对于"向左"对齐,我们也可以使用"开始"。

首选"开始"和"结束"是确保从右到左语言环境正确的布局行为。

android:gravity可以具有以下值之一:left,start,right,end,top,bottom,center,center_horizontal,center_vertical。

下图显示了在Android应用程序屏幕中右对齐的Vertical LinearLayout的外观。

1.3)LinearLayout权重

LinearLayout允许我们在子视图上设置权重。
这将表示特定视图从其父视图使用的宽度或者高度份额。

我们必须在子视图中为LinearLayout和android:layout_weight属性指定ʻandroid:weightSum`。

以下XML布局创建宽度相等的子视图。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:orientation="horizontal"
  android:weightSum="3"
  android:layout_height="match_parent">

  <Button
      android:layout_weight="1"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:background="@android:color/holo_green_light"
      android:text="Button 1" 

  <Button
      android:layout_weight="1"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:text="Button 2" 

  <Button
      android:layout_weight="1"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:text="Button 3" 

</LinearLayout>
  • 在子视图上设置了" layout_weight"。
    我们必须将宽度指定为" 0dp",以便使用LinearLayout中的布局权重自动计算宽度。

  • 类似地,如果方向是垂直的,并且指定了布局权重,则必须将" layout_height"指定为" 0dp"。
    它会根据" layout_weight"属性自动计算得出。

1.4)嵌套的LinearLayout

以下XML布局显示了嵌套布局,水平布局和垂直布局以及布局权重。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  android:weightSum="3">

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:orientation="vertical"
      android:weightSum="0.8">

      <ImageView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="0.4"
          android:src="@mipmap/ic_launcher" 

      <ImageView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="0.2"
          android:src="@mipmap/ic_launcher" 

      <ImageView
          android:layout_width="match_parent"
          android:layout_height="0dp"
          android:layout_weight="0.2"
          android:src="@mipmap/ic_launcher" 

  </LinearLayout>

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1.2"
      android:gravity="center"
      android:weightSum="1.5">

      <Button
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_gravity="top"
          android:layout_weight="0.5"
          android:background="@android:color/holo_green_light"
          android:text="Button 1" 

      <Button
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="0.6"
          android:text="Button 2" 

      <Button
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_gravity="bottom|right"
          android:layout_weight="0.4"
          android:text="Button 3" 

  </LinearLayout>

  <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"
      android:gravity="center"
      android:weightSum="1.5">

      <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="0.4"
          android:background="@android:color/holo_green_light"
          android:text="Androidly 1" 

      <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="0.7"
          android:background="@android:color/black"
          android:gravity="center"
          android:text="Androidly 2"
          android:textColor="@android:color/white" 

      <TextView
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_weight="0.4"
          android:background="@android:color/holo_purple"
          android:text="Androidly 3"
          android:textColor="@android:color/white" 

  </LinearLayout>

</LinearLayout>

我们已经为每个子级LinearLayouts设置了布局权重。
gravity属性用于设置所有儿童视图的重力。
layout_gravity用于设置ChildView相对于布局的重力。

1.5)以编程方式创建LinearLayout

我们可以在Kotlin Activity类中创建LinearLayout。

我们可以在实例上使用addView()函数在LinearLayout中添加按钮。
它将附加的视图附加到布局的末尾。

我们可以在addView()函数中将索引作为第二个参数传递,以将子视图添加到特定位置。

让我们看看我们的Android Studio项目中的activity_main.xml代码。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/linearLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:orientation="horizontal"
  android:weightSum="3">

</LinearLayout>

以下代码以编程方式在MainActivity.kt类的LinearLayout中添加子视图。

package net.androidly.androidlylayouts

import android.graphics.drawable.GradientDrawable
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.v4.content.ContextCompat
import android.support.v7.widget.LinearLayoutCompat
import android.widget.Button
import kotlinx.android.synthetic.main.activity_main.*
import android.widget.LinearLayout

class MainActivity : AppCompatActivity() {

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      linearLayout.weightSum = 3f
      linearLayout.orientation = LinearLayout.VERTICAL

      val params = LinearLayout.LayoutParams(
              LinearLayout.LayoutParams.MATCH_PARENT, 0)
      params.weight = 1f

      var button = Button(this)
      button.text = "Androidly Button 1"
      button.setBackgroundColor(ContextCompat.getColor(this, android.R.color.holo_purple))
      button.layoutParams = params

      linearLayout.addView(button)

      button = Button(this)
      button.text = "Androidly Button 2"
      button.setBackgroundColor(ContextCompat.getColor(this, android.R.color.holo_green_dark))
      button.layoutParams = params
      linearLayout.addView(button, 0)

      button = Button(this)
      button.text = "Androidly Button 3"
      button.setBackgroundColor(ContextCompat.getColor(this, android.R.color.holo_red_dark))
      button.layoutParams = params
      linearLayout.addView(button, linearLayout.childCount - 1)
  }
}

weightSum属性需要一个浮动值。

对于每个按钮,我们都创建了一个LayoutParams实例,其中,我们使用属性weight设置了layout_weight。

childCount属性为我们提供了LinearLayout中当前的子视图数量。

我们将第二个按钮设置在顶部,将第三个按钮设置在索引上,该索引比孩子数少一个(3-1 = 2)。
因此,它出现在中间,而第一个按钮在底部。

2. RelativeLayout

RelativeLayout用于使视图相对于彼此以及相对于其父视图对齐。

以下XML布局创建RelativeLayout视图。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/relativeLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  

  <Button
      android:text="Center"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerInParent="true" 

  <Button
      android:text="Center-H"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerHorizontal="true" 

  <Button
      android:text="Center-V"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true" 

  <Button
      android:text="Center-VR"
      android:layout_width="wrap_content"
      android:layout_alignParentRight="true"
      android:layout_height="wrap_content"
      android:layout_centerVertical="true"
      android:layout_alignParentEnd="true" 

  <Button
      android:text="Parent-BL"
      android:layout_alignParentBottom="true"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      

  <Button
      android:text="Parent-RT"
      android:layout_alignParentRight="true"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentEnd="true" 

  <Button
      android:text="Parent-LT"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      
  
</RelativeLayout>

RelativeLayout视图的默认位置在左上方。

  • layout_centerVertical = true将视图设置在垂直中心。
    默认情况下,它将保持对齐状态。

  • layout_centerHorizontal = true将视图设置在水平中心。
    默认情况下,它的顶部对齐。

  • layout_centerInParent = true将视图设置在父级的水平和垂直中心。

  • layout_alignParentEnd/Right = true将视图与视图的右端对齐。

2.1)相对于兄弟姐妹

  • layout_above =" @ + id/sibling_id"用于将当前子级设置在同级之上。

  • layout_below在下面进行设置。

  • layout_alignLeft/layout_alignStart =" @ + id/sibling_id"将当前孩子的左边距与同级对齐

  • layout_alignRight/layout_alignEnd =" @ + id/sibling_id"将当前孩子的右边距与同级对齐。

  • 同样,alignBottom和alignTop分别对齐底部和顶部。

  • android:layout_toEndOf/android:layout_toRightOf =" @ + id/sibling_id"将孩子放在同胞的右边。

  • android:layout_alignBaseline =" @ + id/sibling_id"将底部基线对齐。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/relativeLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <Button
      android:id="@+id/button1"
      android:text="1"
      android:background="@android:color/holo_red_dark"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_centerInParent="true" 

  <Button
      android:id="@+id/button2"
      android:text="2"
      android:background="@android:color/holo_blue_dark"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_above="@+id/button1" 

  <Button
      android:id="@+id/button3"
      android:text="3"
      android:background="@android:color/darker_gray"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/button4" 

  <Button
      android:id="@+id/button4"
      android:text="4"
      android:background="@android:color/holo_orange_light"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_below="@+id/button1"
      android:layout_alignRight="@+id/button1"
      android:layout_alignEnd="@+id/button1"

  <Button
      android:id="@+id/button5"
      android:text="5"
      android:background="@android:color/holo_purple"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_toRightOf="@+id/button2"
      android:layout_toEndOf="@+id/button2"
      

  <Button
      android:id="@+id/button6"
      android:text="6"
      android:background="@android:color/holo_green_light"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:layout_toRightOf="@+id/button2"
      android:layout_toEndOf="@+id/button2"
      android:layout_alignBaseline="@+id/button2"
      

</RelativeLayout>

2.2)以编程方式创建RelativeLayout

我们可以使用Kotlin Activity类中的规则设置子视图。

以下是我们的activity_main.xml XML布局。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/relativeLayout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

</RelativeLayout>

MainActivity.kt类正在设置相对布局视图。

package net.androidly.androidlylayouts

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.RelativeLayout
import kotlinx.android.synthetic.main.activity_main.*
import android.view.ViewGroup

class MainActivity : AppCompatActivity() {

  val ID_1 = 1
  val ID_2 = 2
  val ID_3 = 3

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

      var button = Button(this)
      button.text = "1"
      button.id = ID_1

      val lp = RelativeLayout.LayoutParams(
              RelativeLayout.LayoutParams.WRAP_CONTENT,
              RelativeLayout.LayoutParams.WRAP_CONTENT)
      lp.addRule(RelativeLayout.CENTER_IN_PARENT)

      button.layoutParams = lp

      relativeLayout.addView(button)

      button = Button(this)
      button.text = "2"
      button.id = ID_2

      val params = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
      params.addRule(RelativeLayout.BELOW, ID_1)
      button.layoutParams = params

      relativeLayout.addView(button)

      button = Button(this)
      button.text = "3"
      button.id = ID_3

      val lp2 = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
      params.addRule(RelativeLayout.LEFT_OF, ID_2)
      button.layoutParams = lp2

      relativeLayout.addView(button)

  }
}

我们必须使用addRule()方法来设置相对于父母和彼此的孩子布局。