8

我有一个 android 应用程序,它有许多不同的弹出窗口。我想SnackBar在屏幕底部添加一个过度对话框的叠加层。

我尝试了以下代码

if (fragment!= null) {
    Snackbar snackbar = Snackbar.make(fragment.getDialog().getWindow().findViewById(android.R.id.content),
            message, Snackbar.LENGTH_LONG);
    View view = snackbar.getView();
    FrameLayout.LayoutParams params =(FrameLayout.LayoutParams)view.getLayoutParams();
    params.gravity = Gravity.BOTTOM;
    view.setLayoutParams(params);
    snackbar.show();
}

SnackBar出现在底部居中Dialog而不是在屏幕底部。如果我添加Snackbaron currentActivity那么它会出现在对话框的覆盖层下。

安卓小食吧

4

5 回答 5

4

使用以下主题进行全屏自定义对话框

<style name="DialogTheme" parent="android:Theme.Dialog">

<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>


<!-- No backgrounds, titles or window float -->
<item name="android:windowBackground">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">false</item>

在您的对话框中使用它,如下所示:

dialog = new Dialog(this, R.style.DialogTheme);

要使用上述内容,您应该为自定义对话框使用自定义布局。

dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

尝试以上行使您的对话框背景透明。

于 2016-07-12T08:29:57.223 回答
3

您正在将 Dialog 视图解析为

fragment.getDialog().getWindow().findViewById(android.R.id.content)

我建议您改为解析片段布局根视图。

于 2016-07-12T08:16:15.950 回答
2

最后,我想我已经完成了你所期望的。即使我对同一个问题添加了几个答案,我也将此答案添加为单独的答案,以便您更清楚。

在此处输入图像描述

它的 UI 很脏,我准备得很仓促。你能看到StackBar屏幕底部的。当你点击OK按钮时显示AlertDialog

这是我的做法。

以下代码属于custom_dialog_layout.xml

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

<ImageView
    android:id="@+id/image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@mipmap/ic_launcher"/>

<TextView
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    android:text="Sample Test for Custom Dialog"
    android:textSize="20sp"
    android:layout_toRightOf="@+id/image"
    android:layout_alignBottom="@+id/image" />/>

<Button
    android:id="@+id/dialogButtonOK"
    android:layout_width="100px"
    android:layout_height="wrap_content"
    android:text=" Ok "
    android:layout_below="@+id/text"
    android:layout_centerHorizontal="true" />

以下代码属于activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/rootView"
tools:context="com.stackoverflow.answer.androidcustomdialog.MainActivity">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!" />

以下代码属于MainActivity.java

package com.stackoverflow.answer.androidcustomdialog;

import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final View rootView=(View)findViewById(R.id.rootView);

    AlertDialog.Builder mAlertDialogBuilder = new AlertDialog.Builder(this);
    // inflate the custom dialog view
    LayoutInflater inflater=getLayoutInflater();
    final View mDialogView = inflater.inflate(R.layout.custom_dialog_layout, null);
    // set the View for the AlertDialog
    mAlertDialogBuilder.setView(mDialogView);

    Button btn = (Button) mDialogView.findViewById(R.id.dialogButtonOK);
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Pass the RootView to the SnackBar
            Snackbar
                    .make(rootView, "SnackBar in Dialog", Snackbar.LENGTH_LONG)
                    .show();
        }
    });
    AlertDialog alertDialog = mAlertDialogBuilder.create();
    alertDialog.show();
}
}

随意问任何你需要的东西。在这个例子中,我没有使用片段。如果你需要我也可以帮忙。如果您需要,我也可以发送项目。给我你的电子邮件 :)

总而言之,我真正所做的是,只需将 Root Layout View 传递给SnackBar. 就这么简单。

还有一件事..

根据Google Material Design Snackbars & Toasts Usage Reference

放置

Snackbars 出现在屏幕上大多数元素的上方,它们的高度与浮动操作按钮相同。但是,它们的高度低于对话框、底部工作表和导航抽屉。

因此,Snackbar 的高度总是比对话框低。

于 2016-07-12T20:04:54.133 回答
1

试试这个解决方案:使用材质对话框:
custom_dialog_layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="@android:color/black"
    android:text="Sample Test for Custom Dialog"
    android:textSize="20sp"
    android:layout_toRightOf="@+id/image"
    android:layout_alignBottom="@+id/image" />/>

<Button
    android:id="@+id/dialogButtonOK"
    android:layout_width="100px"
    android:layout_height="wrap_content"
    android:text=" Ok "
    android:layout_below="@+id/text"
    android:layout_centerHorizontal="true" />
    <android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:id="@+id/coordinatorLayout"
    android:layout_height="wrap_content">
</android.support.design.widget.CoordinatorLayout>
</RelativeLayout>

片段.java

    final MaterialDialog dialog = new MaterialDialog.Builder(context)
                .customView(R.layout.custom_dialog_layout, false)
                .positiveText(R.string.btn_OK)
                .canceledOnTouchOutside(false)

                .negativeText(android.R.string.cancel)
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                                @Override
                                public void onClick(@NonNull final MaterialDialog dialog, @NonNull DialogAction which) {
Snackbar.make(mCoordinatorLayout, "Please Enter All fields!", Snackbar.LENGTH_LONG).show();
                                                    dialog.show();
})

                .build()
 positiveAction = dialog.getActionButton(DialogAction.POSITIVE);
  mCoordinatorLayout = (CoordinatorLayout) dialog.getCustomView().getRootView().findViewById(R.id.coordinatorLayout);
 dialog.show();
于 2017-06-21T07:07:11.503 回答
1

此处LayoutInflater.inflate改为使用。尝试根据需要映射代码。 在这里您可以找到更多信息

 AlertDialog.Builder mAlertDialogBuilder = new AlertDialog.Builder(this);
LayoutInflater inflater = this.getLayoutInflater();
// inflate the custom dialog view
final View mDialogView = inflater.inflate(R.layout.dialog_layout, null);
// set the View for the AlertDialog
mAlertDialogBuilder.setView(mDialogView);

Button btn = (Button) mDialogView.findViewById(R.id.dialog_btn);
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Pass the mDialogView to the SnackBar
        Snackbar
                .make(mDialogView, "SnackBar in Dialog", Snackbar.LENGTH_LONG)
                .show();
    }
});
AlertDialog alertDialog = mAlertDialogBuilder.create();
alertDialog.show();

如果您需要帮助将其映射到您的代码,请随时询问

于 2016-07-12T10:49:17.080 回答