我想尝试在Android支持库23.2中引入BottomSheetDialog,但它似乎无法正常工作。医生说:
虽然BottomSheetBehavior捕获持久的底部工作表案例,但此版本还提供了BottomSheetDialog和
BottomSheetDialogFragment用于填充模式的底部工作表用例。
只需将appcompattialog或appcompattialogfragment替换为它们的
将对话框设置为底端的底端工作表等效项
工作表。”
所以我把我的AppCompatDialog改为BottomSheetDialog

package my.package.ui.dialog;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.design.widget.BottomSheetDialog;

import my.package.R;

public class AccountActionsDialog extends BottomSheetDialog {
    public AccountActionsDialog(Context context) {
        super(context);

        if (context instanceof Activity) {
            setOwnerActivity((Activity) context);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getLayoutInflater().inflate(R.layout.dialog_account_actions, null));
    }
}

这是我的布局文件:
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ff0000"
        android:padding="16dp"
        android:text="Delete account"
        android:textColor="#ffffff" />

</LinearLayout>

然后在我的活动中使用以下代码:
new AccountActionsDialog(this).show();

我的屏幕变暗,但对话框的内容不可见。有没有想过可能会遗漏什么?当我使用AppCompatDialog时,它工作得很好。

最佳答案

这是BottomSheetDialog的布局文件。

<android.support.design.widget.CoordinatorLayout
    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="match_parent"
    android:soundEffectsEnabled="false">

<FrameLayout
        android:id="@+id/design_bottom_sheet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        app:layout_behavior="@string/bottom_sheet_behavior"
        style="?attr/bottomSheetStyle"/>

</android.support.design.widget.CoordinatorLayout>

您的内容视图位于视图design_bottom_sheet内,它将垂直放置在中心位置,并将其偏移。
mParentHeight = parent.getHeight();
mMinOffset = Math.max(0, mParentHeight - child.getHeight());
mMaxOffset = mParentHeight - mPeekHeight;
if (mState == STATE_EXPANDED) {
    ViewCompat.offsetTopAndBottom(child, mMinOffset);
} else if (mHideable && mState == STATE_HIDDEN) {
    ViewCompat.offsetTopAndBottom(child, mParentHeight);
} else if (mState == STATE_COLLAPSED) {
    ViewCompat.offsetTopAndBottom(child, mMaxOffset);
}

它打算将CoordinatorLayout放置在BottomSheetBehavior处,但实际上子视图的初始gettop不是0,而是design_bottom_sheet,因此如果偏移量大于所需偏移量,则可以查看。
找到视图mMaxOffset并将其重力设置为(mParentHeight - childHeight) / 2将修复它。但是,如果childheight小于mpeekhight,内容视图下面将有空白区域。
但是,如果design_bottom_sheet,则Gravity.TOP | Gravity.CENTER_HORIZONTAL将小于peekHeight > childHeight,这将导致奇怪的行为。
也许应该把代码改成
mMaxOffset = Math.max((mParentHeight - mPeekHeight), mMinOffset);

安装
mMaxOffset = mParentHeight - child.getHeight();

08-18 19:12