【问题标题】:Android Studio Dialog Buttons out of Screen when using Wrap Content as LayoutParams将内容包装为 LayoutParams 时,Android Studio 对话框按钮超出屏幕
【发布时间】:2019-06-24 19:17:18
【问题描述】:

我的布局文件夹中有一个带有自定义布局的对话框,该对话框包含其内容。如果我将一个大文本放入其中一个 TextField 中,底部的按钮就会消失。文本本身是可滚动的,其他一切都很好。如果文本太大,我希望按钮粘在对话框的底部并且不会消失。 Dialog without TextInputDialog with large Text。我不能直接发布图片,所以我只包含了链接。

我已经尝试更改布局,以便按钮粘在布局的底部,而不是它们上方的 TextView。设置固定大小并不是真正的选项。

Dialog Layout的布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg_layout_rounded_16">

    <EditText
        android:id="@+id/dialog_resource_title"
        style="@style/myEditTextStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:hint="@string/general_title_hint"
        android:inputType="textMultiLine"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/dialog_resource_description"
        style="@style/myEditTextStyle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="16dp"
        android:layout_marginBottom="8dp"
        android:hint="@string/general_description_hint"
        android:inputType="textMultiLine"
        app:layout_constraintBottom_toTopOf="@+id/dialog_resource_cancel"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/dialog_resource_title" />

    <Button
        android:id="@+id/dialog_resource_cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="4dp"
        android:layout_marginBottom="8dp"
        android:paddingBottom="8dp"
        android:text="@string/general_cancel"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/dialog_resource_middle_line"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent" />

    <Button
        android:id="@+id/dialog_resource_save"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="4dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="@string/general_save"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="@+id/dialog_resource_middle_line" />

    <android.support.constraint.Guideline
        android:id="@+id/dialog_resource_middle_line"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.5" />

</android.support.constraint.ConstraintLayout>


Initialisation of the Dialog:



        resourceDialog = new Dialog(context);

        View v = LayoutInflater.from(context).inflate(R.layout.dialog_resource, null);

        this.resourceDialogTitle = v.findViewById(R.id.dialog_resource_title);
        this.resourceDialogDescription = v.findViewById(R.id.dialog_resource_description);
        this.resourceDialogCancel = v.findViewById(R.id.dialog_resource_cancel);
        this.resourceDialogSave = v.findViewById(R.id.dialog_resource_save);

        resourceDialog.setContentView(v);
        // Set Color of Root View (Otherwise white Background in the Corners)
        resourceDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);

        // Getting the Display Metrics to set Size of Dialog
        DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
        int width = displayMetrics.widthPixels;

        // Setting the Size
        resourceDialog.getWindow().setLayout((width - 128), ViewGroup.LayoutParams.WRAP_CONTENT);

        resourceDialog.setCanceledOnTouchOutside(false);

【问题讨论】:

    标签: java android


    【解决方案1】:

    您可以尝试以下代码来获得自定义对话框:

    XML 布局文件(R.layout.dialog_custom_layout)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:orientation="vertical"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:padding="@dimen/padding_8dp">
    
        <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="User Details"
                android:gravity="center"/>
    
              <EditText
                    android:id="@+id/email_EditText"
                    android:layout_height="wrap_content"
                    android:hint="@string/email"
                    android:inputType="textEmailAddress"
                    android:imeOptions="actionNext"
                    android:maxLines="1"
                    android:layout_width="match_parent"/>
    
               <EditText
                    android:id="@+id/password_EditText"
                    android:layout_height="wrap_content"
                    android:hint="@string/password"
                    android:inputType="text"
                    android:imeOptions="actionDone"
                    android:maxLines="1"
                    android:layout_width="match_parent"/>
    
            <Button
                    android:id="@+id/btnRegister"
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_marginStart="@dimen/margin_8dp"
                    android:layout_marginEnd="@dimen/margin_8dp"
                    android:layout_height="wrap_content"
                    android:text="Register"/>
    
    </LinearLayout>
    

    Kotlin code to inflate custom layout:

    val alertDialog = AlertDialog.Builder(context)
    val customView = LayoutInflater.from(context)
                    .inflate(R.layout.dialog_custom_layout, null)
    val btnRegister = customView.btnRegister
    alertDialog.setView(customView)
    val customDialog = alertDialog.create()
    customDialog.show()
    btnRegister.setOnClickListener {
     //perform registration
    }
    

    PS:您可以根据需要更改布局!

    【讨论】:

      【解决方案2】:

      将按钮放置在线性布局中,并使用约束选项将其约束到屏幕底部。例如

      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentBottom="true"
          android:layout_centerInParent="true"
          android:orientation="horizontal"
          app:layout_constraintBottom_toBottomOf="parent">
      
          <Button />
      
          <Button />
      </LinearLayout>
      

      --编辑-- 我试过这个并为我工作

      <?xml version="1.0" encoding="utf-8"?>
      <android.support.constraint.ConstraintLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent">
      
      
      <android.support.v4.widget.NestedScrollView
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:fillViewport="true"
          android:fitsSystemWindows="true"
          android:paddingBottom="120dp"
          android:scrollbars="horizontal"
          app:layout_constraintTop_toBottomOf="@+id/appBarLayout">
      
          <LinearLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_below="@id/appBarLayout"
              android:layout_marginLeft="10dp"
              android:layout_marginTop="14dp"
              android:layout_marginRight="10dp"
              android:orientation="vertical">
              <TextView
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="@string/address"
                  android:textColor="@color/black_1"
                  android:textSize="20sp"
                  android:textStyle="bold" />
      
      
          </LinearLayout>
      
      </android.support.v4.widget.NestedScrollView>
      
      <LinearLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentBottom="true"
          android:layout_centerInParent="true"
          android:orientation="horizontal"
          app:layout_constraintBottom_toBottomOf="parent">
      
          <Button
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:layout_marginRight="4dp"
              android:textColor="@android:color/white" />
      
          <Button
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_weight="1"
              android:layout_marginLeft="4dp"
              android:textColor="@android:color/white" />
      </LinearLayout>
      
      </android.support.constraint.ConstraintLayout>
      

      【讨论】:

      • 我尝试这样做以及将按钮限制在底部,但由于某种原因它仍然没有显示按钮。我认为这可能是因为对话框在屏幕之外扩展,所以我需要将其最大高度设置为我的 ScreenSize。也许那行得通,我会测试一下
      • 我稍后会尝试,但这应该可以。提前致谢
      • 为我工作。更改了它,因此按钮也位于嵌套的 ScrollView 中,因为我认为它看起来更好一些。感谢 Wuick 的帮助
      • 很高兴我能帮上忙
      【解决方案3】:

      尝试将您的 EditText 高度从 wrap_content 更改为 0dp(这样它就不会与您的按钮重叠)并将其限制在屏幕底部的一个按钮上:

        <EditText
          android:id="@+id/dialog_resource_description"
          android:layout_width="0dp"
          android:layout_height="0dp"
          android:layout_marginStart="16dp"
          android:layout_marginTop="8dp"
          android:layout_marginEnd="16dp"
          android:hint="some text"
          android:inputType="textMultiLine"
          app:layout_constraintBottom_toTopOf="@+id/dialog_resource_cancel"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/dialog_resource_title" />
      

      这是完整的布局文件:

      <?xml version="1.0" encoding="utf-8"?>
      <android.support.constraint.ConstraintLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">
      
      <EditText
          android:id="@+id/dialog_resource_title"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_marginStart="16dp"
          android:layout_marginTop="8dp"
          android:layout_marginEnd="8dp"
          android:hint="general_title_hint"
          android:inputType="textMultiLine"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintHorizontal_bias="0.498"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
      
      <EditText
          android:id="@+id/dialog_resource_description"
          android:layout_width="0dp"
          android:layout_height="0dp"
          android:layout_marginStart="16dp"
          android:layout_marginTop="8dp"
          android:layout_marginEnd="16dp"
          android:hint="some text"
          android:inputType="textMultiLine"
          app:layout_constraintBottom_toTopOf="@+id/dialog_resource_cancel"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toBottomOf="@+id/dialog_resource_title" />
      
      <Button
          android:id="@+id/dialog_resource_cancel"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_marginStart="8dp"
          android:layout_marginEnd="4dp"
          android:layout_marginBottom="8dp"
          android:paddingBottom="8dp"
          android:text="general_cancel"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toStartOf="@+id/dialog_resource_middle_line"
          app:layout_constraintHorizontal_bias="0.0"
          app:layout_constraintStart_toStartOf="parent" />
      
      <Button
          android:id="@+id/dialog_resource_save"
          android:layout_width="0dp"
          android:layout_height="wrap_content"
          android:layout_marginStart="4dp"
          android:layout_marginEnd="8dp"
          android:layout_marginBottom="8dp"
          android:text="general_save"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintHorizontal_bias="0.0"
          app:layout_constraintStart_toStartOf="@+id/dialog_resource_middle_line" />
      
      <android.support.constraint.Guideline
          android:id="@+id/dialog_resource_middle_line"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:orientation="vertical"
          app:layout_constraintGuide_percent="0.5" />
      
      </android.support.constraint.ConstraintLayout>
      

      【讨论】:

      • 这会导致对话框不是自动调整文本大小,而是具有固定大小对吗?因为我希望它很小,但在大输入上扩展
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多