Android DialogFragment 自适应高度

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

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 引用

相关帖子

欢迎来到这里!

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

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