Android DialogFragment 自适应高度

本贴最后更新于 1464 天前,其中的信息可能已经沧海桑田

DialogFragment 自适应高度

我们用 DialogFragment 来显示一些信息。
dialog 的高度会随着显示的信息的多少而变化。

下面给出几个例子

4 个 layout

先准备一些文字资源

<string name="sample_text2">欢迎来看我的工程</string>

不同的 layout,显示同样多的控件

ConstraintLayout

show_version_dialog_con.xml
显示几个 TextView

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:minWidth="200dp"
    android:orientation="vertical"
    android:paddingStart="0dp"
    android:paddingEnd="0dp"
    android:paddingBottom="12dp">

    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="Title"
        android:textColor="#120101"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text=""
        android:textColor="#222222"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/title_tv" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/sample_text2"
        android:textColor="#222222"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv1" />

    <Button
        android:id="@+id/confirm_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:paddingStart="12dp"
        android:paddingEnd="12dp"
        android:text="OK"
        android:textColor="#222222"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv2" />

</androidx.constraintlayout.widget.ConstraintLayout>

dfconnormal.png

ConstraintLayout button 靠底

相比于上一个,我们把 Button 的位置改为在父 layout 的底部。
show_version_dialog_con_btn_bot.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#fff"
    android:minWidth="200dp"
    android:orientation="vertical"
    android:paddingStart="0dp"
    android:paddingEnd="0dp"
    android:paddingBottom="12dp">

    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="Title"
        android:textColor="#120101"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text=""
        android:textColor="#222222"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/title_tv" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/sample_text2"
        android:textColor="#222222"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv1" />

    <Button
        android:id="@+id/confirm_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:paddingStart="12dp"
        android:paddingEnd="12dp"
        android:text="OK"
        android:textColor="#222222"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

最后一个 Button 设置了 app:layout_constraintBottom_toBottomOf="parent"

dfconbtnbot.png

RelativeLayout

show_version_dialog_rela.xml

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

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="我是标题" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/title"
        android:layout_centerHorizontal="true"
        android:textColor="#007CFF" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv1"
        android:layout_centerHorizontal="true"
        android:text="@string/sample_text2"
        android:textColor="#007CFF" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv2"
        android:layout_centerHorizontal="true"
        android:layout_marginEnd="20dp"
        android:text="yes" />

</RelativeLayout>

dfrelanormal.png

RelativeLayout button 靠底

show_version_dialog_rela_btn_bot.xml

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

    <TextView
        android:id="@+id/title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="我是标题" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/title"
        android:layout_centerHorizontal="true"
        android:textColor="#007CFF" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv1"
        android:layout_centerHorizontal="true"
        android:text="@string/sample_text2"
        android:textColor="#007CFF" />

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginEnd="20dp"
        android:text="yes" />

</RelativeLayout>

最后一个 Button 设置了 android:layout_alignParentBottom="true"

dfrelabtnbot.png

DialogFragment 的代码

显示一些系统基础信息。

import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;

public class ShowVersionDialogFrag extends DialogFragment {
    private static final String TAG = "rustAppShowVersion";
    public int layoutId = R.layout.show_version_dialog_con;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d(TAG, "onCreateView");
        return inflater.inflate(layoutId, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d(TAG, "onViewCreated");
        TextView tv1 = view.findViewById(R.id.tv1);
        final String text1 = "RustFisher \nSDK_INT: " + Build.VERSION.SDK_INT +
                "\nBuild.MODEL: " + Build.MODEL +
                "\nBuild.PRODUCT: " + Build.PRODUCT +
                "\nBuild.BRAND: " + Build.BRAND;
        tv1.setText(text1);
    }
}

使用的时候把 layout 的 id 传进去

private void popShowVersionDialog(int layoutId) {
    ShowVersionDialogFrag dialogFrag = new ShowVersionDialogFrag();
    dialogFrag.layoutId = layoutId;
    dialogFrag.show(getSupportFragmentManager(), "show-dialog-for-bug");
}

运行效果图对比

dfrelanormal.png
dfconnormal.png
dfrelabtnbot.png
dfconbtnbot.png

可以看出,使用 RelativeLayout 时候,如果有控件靠着底部,会把 dialog 拉高。

原文参见:

Android教程 - 高度自适应效果

  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    334 引用 • 323 回帖
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖
  • layout
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...