2016-07-12 20 views
5

Ich habe eine Android-Anwendung, die viele verschiedene Pop-ups hat. Ich möchte ein SnackBar über Overlay Dialog am unteren Rand des Bildschirms hinzufügen.Wie man eine SnackBar am unteren Rand eines Dialog-Overlays hinzufügt

Ich habe versucht, den folgenden Code

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(); 
} 

Aber die SnackBar erscheint auf der Unterseite zentriert Dialog nicht auf dem unteren Rand des Bildschirms. Wenn ich die Snackbar auf aktuelle Activity hinzufügen, dann erscheint es unter dem Overlay des Dialogs.

Android SnackBar

+0

Verwenden Sie benutzerdefinierte Dialog mit benutzerdefinierten Layout die Höhe match_parent hat und versuchen, das Layout des setzen Hintergrund zu transparent, um das gleiche Gefühl zu haben wie der Standarddialog von Android. – Drv

+0

Der Dialog von obigem Bild hat bereits Werte von width und height auf 'match_parent' gesetzt. – roroinpho21

+0

Ich habe meine Antwort bearbeitet, könntest du überprüfen –

Antwort

2

Du Dialog Ansicht als

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

Ich schlage vor, Sie root-Fragment-Layout-Ansicht statt zu analysieren.

+0

Sollte ich eine ID zu meiner Top Layout Komponente hinzufügen und sie dann an' SnackBar' übergeben 'findViewById (R.id.my_dialog_parent_component_id)'? – roroinpho21

+0

Das ist was ich meinte –

+0

Ich habe versucht, es funktioniert nicht. – roroinpho21

2

Verwenden Sie die folgende Thema für die Vollbild benutzerdefinierten Dialog

<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> 

es in Ihrem Dialog verwenden, wie unten:

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

über Dinge zu verwenden, sollten Sie benutzerdefiniertes Layout verwenden für Ihre benutzerdefiniertes Dialogfeld

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

Versuchen Sie über Zeile, um Ihren Dialoghintergrund transparent zu machen.

+0

Ich habe versucht, Ihre Lösung, aber in diesem Fall Dialog wird die gleiche Höhe wie das Display und ich möchte, dass die 'Dialog' haben 'wrap_content' für die Höhe. Um dieses Problem zu lösen, habe ich versucht, meinem Ressourcen-Layout ein neues 'RelativeLayout' hinzuzufügen und es transparent zu machen, aber es scheint, dass sein Hintergrund weiß ist. – roroinpho21

+0

@ roroinpho21 Ich habe meine ans, pls überprüft, ob es hilft. – Drv

+0

Vielen Dank für Ihre schnelle Wiederholung. Jetzt ist es fast, was ich will. Wenn ich auf die transparente Zone klicke, möchte ich den Dialog "ablehnen". In diesem Moment passiert nichts. Ich denke, ich sollte ein 'onCLick'-Ereignis als Workaround hinzufügen. Außerdem möchte ich, wenn es möglich ist, die transparente Farbe durch ein transparentes Schwarz ersetzen, wie es auf dem Bild von meinem Beitrag zu sehen ist. – roroinpho21

0

Hier wird stattdessen LayoutInflater.inflate verwendet. Versuchen Sie, den Code nach Bedarf zuzuordnen. Here you can find more info

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(); 

Wenn Sie eine Hilfe benötigen es, um Ihren Code abzubilden, sich zu fragen,

+0

In diesem Fall erscheint die "Snackbar" am unteren Rand des Dialogs nicht am unteren Bildschirmrand. – roroinpho21

1

Schließlich denke ich, ich habe getan, was Sie erwarten. Auch wenn ich noch ein paar Antworten auf diese Frage hinzugefügt habe, füge ich diese Antwort als separate Antwort hinzu, um Ihnen klarer zu sein.

enter image description here

Seine schmutzige UI, ich bereitete es sehr rushy. Können Sie die StackBar am unteren Rand des Bildschirms sehen. Es wird angezeigt, wenn Sie auf die Schaltfläche OK der AlertDialog

klicken. Hier ist, wie ich es gemacht habe.

folgenden Code gehört zu 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" /> 

folgenden Code gehört zu 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!" /> 

folgenden Code MainActivity.java gehört

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(); 
} 
} 

Fühlen Sie sich frei zu fragen, was Sie brauchen. In diesem Beispiel verwende ich keine Fragmente. Wenn Sie brauchen, kann ich auch damit helfen. und ich kann das Projekt auch senden, wenn Sie brauchen. Geben Sie mir Ihre E-Mail :)

Als Zusammenfassung, Was ich wirklich getan habe, ist, übergeben Sie einfach die RooT Layout-Ansicht an die SnackBar. Es ist so einfach.

One More Thing ..

Nach der Google Material Design Snackbars & Toasts Usage Referenz

Platzierung

Snackbar über die meisten Elemente erscheinen auf dem Bildschirm, und sie sind gleich in Höhe auf die schwebende Aktionstaste. Sie sind jedoch in Elevation niedriger als Dialoge, untere Blätter und Navigationsschubladen.

So wird die Snackbar immer niedriger in der Höhe angezeigt als Dialoge.

+1

Danke für Ihre Antwort. Was ich will ist, die 'Snackbar' über' Dialog' zu stellen, aber wie du mir in deinem Beitrag gezeigt hast, erscheint die 'Snackbar' immer tiefer in der Höhe als Dialoge. – roroinpho21

+0

Ich denke, Sie können dies als richtige Antwort markieren, ist es nicht –

+0

Nun, nichts für ungut, aber es ist ja und nein. Ja, weil ich aufgegeben habe, die 'Snackbar' über den Dialog zu stellen, und nein, wenn jemand die 'Snackbar'-Über-Dialog-Überlagerung haben möchte, hilft dieses Code-Snippet nicht. – roroinpho21

1

Versuchen Sie, diese Lösung: Verwendetes Material Dialog:
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> 

fragment.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();