【问题标题】:How to set dialog layout be as a background shape?如何将对话框布局设置为背景形状?
【发布时间】:2020-04-16 17:06:28
【问题描述】:

我有我的自定义对话框实现

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.annotation.NonNull;


public class TutorialDialog extends Dialog
{
    private TextView mTvClose;
    private Button mBtnCheck;
    private EditText mEtLink;

    private DialogCallback mCallback;

    public interface DialogCallback
    {
        void doOnCheckClick(@NonNull final String iLink);
    }

    public TutorialDialog(@NonNull final Context iC)
    {
        super(iC);
    }

    public Dialog setCallback(@NonNull final DialogCallback iCallback)
    {
        mCallback = iCallback;
        return this;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.other_tutorial_dialog_layout);

        initRefs();
        setListeners();
    }

    private void setListeners()
    {
        mBtnCheck.setOnClickListener(i -> doOnCheckBtnClick());

        mTvClose.setOnClickListener(i -> doOnCloseBtnClick());
    }

    private void doOnCloseBtnClick()
    {
        dismiss();
    }

    private void doOnCheckBtnClick()
    {
        String modelLink = mEtLink.getText().toString();

        if (TextUtils.isEmpty(modelLink))
        {
            ((PresidentApp) getContext().getApplicationContext()).sendToast(getContext().getString(R.string.some_text_here));
        }
        else if (mCallback != null)
        {
            mCallback.doOnCheckClick(mEtLink.getText().toString());
            dismiss();
        }
    }

    private void initRefs()
    {
        mEtLink = findViewById(R.id.et_ask_password_link);
        mBtnCheck = findViewById(R.id.btn_ask_password_download);
        mTvClose = findViewById(R.id.tv_ask_password_close);
    }

    @Override
    public void onDetachedFromWindow()
    {
        mBtnCheck.setOnClickListener(null);
        mTvClose.setOnClickListener(null);
        mCallback = null;
        super.onDetachedFromWindow();
    }
}

这是一个布局

<?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="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/background_tutorial_dialog"
    android:orientation="vertical">

    <TextView
        android:id="@+id/tv_ask_password_close"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginTop="8dp"
        android:background="@drawable/ic_close"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/tv_ask_password_header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="@string/some_text_here"
        android:textColor="@android:color/white"
        app:layout_constraintBottom_toTopOf="@+id/et_ask_password_link"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <EditText
        android:id="@+id/et_ask_password_link"
        android:layout_width="300dp"
        android:layout_height="40dp"
        android:layout_marginEnd="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginTop="16dp"
        android:paddingEnd="16dp"
        android:paddingStart="16dp"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textColor="#AD3366BB"
        android:textColorHint="#AD3366BB"
        app:layout_constraintBottom_toTopOf="@+id/btn_ask_password_download"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tv_ask_password_header"/>

    <Button
        android:id="@+id/btn_ask_password_download"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp"
        android:layout_marginTop="16dp"
        android:backgroundTint="@android:color/holo_green_light"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/et_ask_password_link"/>

</androidx.constraintlayout.widget.ConstraintLayout>

如你所见,我正在使用背景

android:background="@drawable/background_tutorial_dialog"

这里是xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#FFFFFF"/>

    <stroke
        android:width="3dp"
        android:color="#000000"/>

    <corners
        android:radius="30dp"/>

</shape>

结果是

如您所见,形状的边缘是圆角的,但对话框布局仍然有背景。

我做错了什么?

【问题讨论】:

    标签: android


    【解决方案1】:

    您必须为您的对话框类编辑和设置自定义样式,例如以下答案:android custom dialog background

    【讨论】:

      【解决方案2】:

      这必须以编程方式完成试试这个,这可能会帮助你:

      dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
      dialog?.window?.setLayout(your_width, your_height)
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 2012-11-01
        相关资源
        最近更新 更多