使对话框宽度占满整个屏幕

3

嗯,这个问题已经有很多人问过了,但是没有一种方法可以解决。

我试图将对话框的宽度扩展到全屏。

对话框布局:

<?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:id="@+id/constraint_layout"
        android:layout_width="match_parent"
        android:layout_height="300dp">

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

        <TextView
            android:fontFamily="@font/gotham_medium_regular"
            android:textAllCaps="true"
            android:id="@+id/textView6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="Login"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
            android:textStyle="bold"
            app:layout_constraintStart_toStartOf="@+id/guideline3"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:fontFamily="@font/gotham_light"
            android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
            android:layout_marginTop="8dp"
            app:layout_constraintStart_toStartOf="@+id/guideline3"
            app:layout_constraintTop_toBottomOf="@+id/textView6"
            android:id="@+id/textView7"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Enter your phone number to proceed" />

        <android.support.design.widget.TextInputLayout
            android:id="@+id/text_input"
            android:layout_marginTop="24dp"
            android:layout_width="0dp"
            app:layout_constraintTop_toBottomOf="@+id/textView7"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="@+id/guideline4"
            app:layout_constraintStart_toStartOf="@+id/guideline3">

            <android.support.design.widget.TextInputEditText
                android:id="@+id/userPhone"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:fontFamily="@font/gotham_light"
                android:hint="PHONE NUMBER"
                android:inputType="phone"
                android:text="+91" />
        </android.support.design.widget.TextInputLayout>



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


        <Button
            android:layout_marginBottom="@dimen/activity_horizontal_margin"
            android:id="@+id/continueButton"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@drawable/button_background"
            android:fontFamily="@font/gotham_light"
            android:text="Continue"
            android:textColor="@android:color/white"
            app:layout_constraintEnd_toEndOf="@+id/guideline4"
            app:layout_constraintStart_toStartOf="@+id/guideline3"
            app:layout_constraintTop_toBottomOf="@+id/text_input" />


    </android.support.constraint.ConstraintLayout>

对话框代码:

 val dialogBuilder = AlertDialog.Builder(ContextThemeWrapper(context,R.style.ThemeDialog))
        val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
        val dialogView = inflater.inflate(R.layout.mobile_bottom_sheet_layout, null)

        val phone = dialogView.findViewById<EditText>(R.id.userPhone)
        dialogBuilder.setView(dialogView)
        val alertDialog = dialogBuilder.create()

        val countinueButton = dialogView.findViewById<Button>(R.id.continueButton) as Button

        countinueButton.setOnClickListener {

            if(phone.text.toString().isEmpty()){
                phone.error=getString(R.string.empty)
                phone.requestFocus()
            }else if(phone.text.toString().length!=13){
                phone.error=getString(R.string.phone_length_error)
                phone.requestFocus()
            }else{

                checkIfTrainerExists(phone.text.toString(),this@LoginActivity);
            }

        }

        alertDialog.show()

我尝试过的方法:

  1. https://dev59.com/N14b5IYBdhLWcg3w9FkI#28519059
  2. https://dev59.com/dHE85IYBdhLWcg3wvGKm#2680670
  3. https://dev59.com/9nE95IYBdhLWcg3wb9hb#6631310

我也尝试了其他解决方案,但都没有起作用。


你试过这个吗?https://dev59.com/N14b5IYBdhLWcg3w9FkI#40718796 - Goku
是的,@Prem。但它也没有起作用。 - Ankur_009
将您的 ConstraintLayout 的高度设置为 **android:layout_width="match_parent" android:layout_height="match_parent"**。 - Goku
我也尝试过了。无论我设置什么高度,它都像wrap_content一样表现。 - Ankur_009
尽量使用**Dialog而不是AlertDialog.Builder**。 - Goku
您可以查看此答案:https://dev59.com/7WAg5IYBdhLWcg3wFHqF#26207535 - savepopulation
6个回答

5
请查看这个示例 全宽度对话框。这可能会对您有所帮助。

enter image description here

创建以下对话框样式:
 <style name="FullWidth.Dialog" parent="Theme.AppCompat.DayNight.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">false</item>
    <item name="android:windowFullscreen">false</item>
    <item name="android:background">@android:color/transparent</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <!--<item name="android:windowAnimationStyle">@style/DialogAnimation</item>-->
</style>

在 `onCreateDialog` 中为您的对话框添加样式,如下所示:
public class ChangePasswordDialog extends DialogFragment {

private Dialog dialog;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    dialog = new Dialog (getActivity(), R.style.FullWidth_Dialog); //this does the trick.
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    View view = LayoutInflater . from (getActivity()).inflate(
        R.layout.dialog_change_password,
        null
    );
    dialog.setContentView(view);
    dialog.show();
    return dialog;
  }
}

太棒了,感谢您的帮助。我尝试了许多解决方案,但这个解决了问题。 - Abraham Mathew
我很高兴能够提供帮助 :) - Nabin Khatiwada

4
您可以创建一个自定义的FragmentDialog,并且执行以下操作:
@Override
public void onResume() {
    // Resize the dialog to full screen.
    if (getDialog() != null && getDialog().getWindow() != null) {
        Window window = getDialog().getWindow();
        window.setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
    }
    super.onResume();
}

FragmentDialogs教程:


不,我想用这种方式来做。 - Ankur_009
2
好的。但是相信我,复杂的对话框最好使用“FragmentDialogs”。然后,您可以重用对话框,对文本字段进行一些验证,并更好地控制生命周期。 - mbo

2

在Kotlin中创建简单的AlertDialog,你可以使用以下代码:

alertDilog.getWindow().setLayout(
                LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)

alertDialog.show()之后

这里的AlertDialogandroid.support.v7.app.AlertDialog


1
如果您使用ConstraintLayout,它将无法正确匹配约束。为了获得您的布局参数,请在onAttachedToWindow方法中应用它们。
class DialogDownloadFinished(context : Context) : Dialog(context) {

    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       val dialogView =  DialogDownloadFinishedBinding.inflate(LayoutInflater.from(context),null,false)
       requestWindowFeature(Window.FEATURE_NO_TITLE)
       setContentView(dialogView.root)
    }

    override fun onAttachedToWindow() {
       super.onAttachedToWindow()
       window.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
       window.setGravity(Gravity.TOP)
    }
}

1

尝试使用Dialog而不是AlertDialog,这样您可以根据自己的喜好创建自定义对话框。

此外,您还可以进行以下操作:

public class CustomDialog extends Dialog{

    public void onCreate(Bundle savedInstance) {

        super.onCreate(savedInstance);

        setContenctView(R.layout.custom_layout);

        // You can manipulate the Dialog using         
        //Window window = getDialog().getWindow();


    }      

}

1
尝试一下
制作自定义对话框组件。
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;

public class CustomDialog extends Dialog {

     public CustomDialog(@NonNull Context context) {
        super(context);
    }

    public CustomDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_layout);// use your layout in place of this.

    }
}

将下面的代码写在您想要的位置。

CustomDialog dialog=new CustomDialog(MainActivity.this, android.R.style.Theme_Material_Light_NoActionBar_Fullscreen);
                dialog.show();

Screenshot


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接