Android FrameLayout和AbsoluteLayout示例教程

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

在本教程中,我们将深入探讨Android FrameLayout和Android AbsoluteLayout。
这是布局系列的第二篇教程,之前我们研究了Android LinearLayout和RelativeLayout示例。

Android FrameLayout

Android FrameLayout是android系统提供的有用布局之一,它允许用户界面小部件彼此重叠。
在将TextView放在ImageView上的情况下使用。
使用LinearLayout或者RelativeLayout很难实现,因为它们将小部件彼此相邻放置。

FrameLayout旨在一次显示一个项目。
我们可以在一个FrameLayout中包含多个元素,但是每个元素的位置都将基于屏幕的左上角。
在FrameLayout中,所有添加的子视图都像堆栈一样放置。
最新添加的内容显示在顶部。
因此,布局中元素的顺序很重要。

FrameLayout属性

以下是此布局中使用的最重要的属性:

  • android:id:这是唯一标识布局的ID
  • android:foreground:这定义了绘制内容的绘制对象,可能的值可能是颜色值,形式为" #rgb","#argb","#rrggbb"或者" #aarrggbb"
  • android:foregroundGravity:定义要应用于前景可绘制对象的重力。
    重力默认为填充。
    可能的值是上,下,左,右,中心,center_vertical,center_horizontal等
  • android:measureAllChildren:确定在测量时是测量所有子项还是仅测量可见或者不可见状态的子项。
    默认为false

注意事项:

  • 当元素以编程方式隐藏和显示时,FrameLayout可能会变得更加有用
  • 如果未设置重力,则文本将出现在屏幕的左上方

xml布局如下:

layout_frame.xml

<FrameLayout
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  xmlns:android="https://schemas.android.com/apk/res/android">
  <ImageView
      android:src="@android:drawable/alert_dark_frame"
      android:scaleType="fitCenter"
      android:layout_height="fill_parent"
      android:layout_width="fill_parent"
  <TextView
      android:text="theitroad.local"
      android:textSize="24sp"
      android:textColor="#ffff"
      android:layout_height="fill_parent"
      android:layout_width="fill_parent"
      android:gravity="center"
</FrameLayout>

其中我们在TextView上放置了TextView。
与RelativeLayout相比,这不是很简单!

Android AbsoluteLayout

当屏幕上的UI组件相对于布局左上角的原点位于其绝对位置时,将使用Android AbsoluteLayout。
我们需要在屏幕上指定每个组件的x和y坐标位置。
不建议使用此方法,因为它会使UI变得不灵活,事实上,现已弃用了" AbsoluteLayout"。
下面的xml布局代码显示了AbsoluteLayout实现。

layout_absolute.xml

<AbsoluteLayout xmlns:android="https://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <Button
      android:id="@+id/next"
      android:text="Next"
      android:layout_x="10px"
      android:layout_y="5px"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" 
  <TextView
      android:layout_x="19dp"
      android:layout_y="74dp"
      android:text="First Name"
      android:textSize="18sp"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" 
  <EditText
      android:layout_x="140dp"
      android:layout_y="54dp"
      android:width="300px"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" 
  <TextView
      android:layout_x="22dp"
      android:layout_y="137dp"
      android:text="Last Name"
      android:textSize="18sp"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" 
  <EditText
      android:layout_x="143dp"
      android:layout_y="117dp"
      android:width="300px"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content" 
</AbsoluteLayout>

这里layout_x和layout_y属性指定组件的绝对位置。
width属性用于指定EditText的宽度。

项目结构

Android FrameLayout AbsoluteLayout代码

" MainActivity"显示绝对布局,该布局由一个Button组成,用于通过意图启动" SecondActivity"并显示FrameLayout。
下面给出了代码,这些代码是不言自明的:

MainActivity.java

package com.theitroad.layoutsparttwo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

  Button next;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.layout_absolute);

      next=(Button)findViewById(R.id.next);
      next.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              Intent intent= new Intent(MainActivity.this,SecondActivity.class);
              startActivity(intent);
          }
      });

  }
  
  @Override
  public void onBackPressed() {
      finish();
  }
}

MainActivity会覆盖onbackPressed()方法,以在按下后退键时完成活动。

SecondActivity.java

package com.theitroad.layoutsparttwo;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.layout_frame);

  }

  @Override
  public void onBackPressed() {
      super.onBackPressed();
  }
}

在上面的代码中,onBackPressed将我们带回到堆栈中的最新活动,即MainActivity。

以下是我们在android模拟器中运行的应用程序。
我们已经显示了具有预定义宽度的EditText的绝对布局,然后显示了带有TextView的框架布局,并将其放置在可绘制ImageView上。