Android OnGlobalLayoutListener 获取屏幕大小

在开发 Android 应用程序时,有时我们需要获取屏幕的大小来进行相应的布局调整或者适配。Android 提供了 OnGlobalLayoutListener 接口来监听屏幕布局的变化,并获取屏幕大小。本文将介绍如何使用 OnGlobalLayoutListener 接口来获取屏幕大小,并提供代码示例进行说明。

OnGlobalLayoutListener 接口简介

OnGlobalLayoutListener 接口是 ViewTreeObserver 的内部接口,用于监听布局的全局变化。当布局发生变化时,系统会调用该接口的 onGlobalLayout 方法。我们可以在该方法中获取屏幕的大小,并进行相应的操作。

获取屏幕大小

首先,我们需要获取当前的 Activity 的根视图(即根布局),然后通过根视图获取 ViewTreeObserver 对象。接下来,我们可以在 ViewTreeObserver 对象上添加 OnGlobalLayoutListener 接口,并在 onGlobalLayout 方法中获取屏幕的大小。

以下是获取屏幕大小的示例代码:

// 获取屏幕大小
public void getScreenSize() {
    // 获取根视图
    View rootView = getWindow().getDecorView().getRootView();

    // 获取 ViewTreeObserver 对象
    ViewTreeObserver vto = rootView.getViewTreeObserver();

    // 添加 OnGlobalLayoutListener 接口
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // 获取屏幕宽度
            int screenWidth = rootView.getWidth();

            // 获取屏幕高度
            int screenHeight = rootView.getHeight();

            // 进行相应的操作

            // 移除 OnGlobalLayoutListener 接口
            rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });
}

在上述代码中,我们首先通过 getWindow().getDecorView().getRootView() 方法获取了当前 Activity 的根视图,即根布局。然后,我们通过根视图获取了 ViewTreeObserver 对象,并通过 addOnGlobalLayoutListener 方法添加了 OnGlobalLayoutListener 接口。在接口的 onGlobalLayout 方法中,我们可以通过根布局的 getWidth() 和 getHeight() 方法获取屏幕的宽度和高度。

另外,我们在 onGlobalLayout 方法中还可以进行一些额外的操作,比如根据屏幕的大小进行布局调整或者适配。

需要注意的是,在 onGlobalLayout 方法中,我们还需要调用 rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this) 方法来移除 OnGlobalLayoutListener 接口,以避免重复调用。

示例应用

接下来,我们将创建一个示例应用来演示如何使用 OnGlobalLayoutListener 接口获取屏幕大小。

首先,在 activity_main.xml 文件中添加一个 TextView 用于显示屏幕的大小:

<LinearLayout xmlns:android="
    xmlns:tools="
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/screenSizeTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="Screen Size" />

</LinearLayout>

接下来,在 MainActivity.java 文件中添加以下代码:

import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView screenSizeTextView;

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

        // 初始化 TextView
        screenSizeTextView = findViewById(R.id.screenSizeTextView);

        // 获取屏幕大小
        getScreenSize();
    }

    // 获取屏幕大小
    public void getScreenSize() {
        // 获取根视图
        View rootView = getWindow().getDecorView().getRootView();

        // 获取 ViewTreeObserver 对象
        ViewTreeObserver vto = rootView.getViewTreeObserver();

        // 添加 OnGlobalLayoutListener 接口
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                // 获取屏幕宽度
                int screenWidth = rootView.getWidth();

                // 获取屏幕高度
                int screenHeight = rootView.getHeight();

                // 显示屏幕大小
                screenSizeTextView.setText("Screen Size: " + screenWidth