2016-07-12 13 views
5

Ho un'applicazione Android che ha molti diversi pop-up. Voglio aggiungere uno SnackBar overlay del dialogo nella parte inferiore dello schermo.Come aggiungere uno SnackBar nella parte inferiore della sovrapposizione di una finestra di dialogo

Ho provato il seguente codice

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

Ma la SnackBar appare sul fondo della centrato Dialog non sulla parte inferiore dello schermo. Se aggiungo lo Snackbar all'attuale Activity, viene visualizzato sotto l'overlay del dialogo.

Android SnackBar

+0

dialogo Usa personalizzato con layout personalizzato che ha match_parent altezza e cercare di impostare il layout di sfondo trasparente per avere la stessa sensazione della finestra di dialogo predefinita di Android. – Drv

+0

La finestra di dialogo dall'immagine sopra ha già i valori di larghezza e altezza impostati su 'match_parent' – roroinpho21

+0

Ho modificato la mia risposta, potresti controllare –

risposta

2

Si sono parsing vista Dialog come

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

suggerisco di analizzare il layout frammento vista root invece.

+0

Dovrei aggiungere un' id' al mio componente di layout superiore e poi passarlo a 'SnackBar' usando 'findViewById (R.id.my_dialog_parent_component_id)'? – roroinpho21

+0

Questo è quello che intendevo –

+0

Ho provato, non funziona. – roroinpho21

2

Usa sotto tema per finestra personalizzata schermo intero

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

utilizzarlo nella vostra finestra come di seguito:

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

Per utilizzare sopra le cose, è necessario utilizzare layout personalizzato per il vostro finestra di dialogo personalizzata.

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

Provare sopra la linea per rendere trasparente lo sfondo della finestra di dialogo.

+0

Ho provato la tua soluzione ma in questo caso la finestra avrà la stessa altezza del display e voglio che il 'Dialog' abbia' wrap_content' per l'altezza. Per risolvere questo ho provato ad aggiungere un nuovo 'RelativeLayout' al mio layout delle risorse e renderlo trasparente ma sembra che il suo background sia bianco. – roroinpho21

+0

@ roroinpho21 Ho modificato i miei ans, pls controlla se aiuta. – Drv

+0

Grazie per il replay rapido. Ora è quasi quello che voglio. Quando clicco sulla zona trasparente mi piacerebbe "chiudere" la finestra di dialogo in questo momento non succede nulla. Penso che dovrei aggiungere un evento 'onCLick' come soluzione alternativa Vorrei anche, se è possibile, sostituire il colore trasparente con un nero trasparente come si può vedere nella foto dal mio post. – roroinpho21

0

Qui viene utilizzato LayoutInflater.inflate. Prova a mappare il codice di cui hai bisogno. 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(); 

Se avete bisogno di un aiuto per mappare al vostro codice, non esitate a chiedere

+0

In questo caso il 'Snackbar' appare nella parte inferiore della finestra di dialogo non nella parte inferiore dello schermo. – roroinpho21

1

Infine penso di aver fatto quello che ci si aspetta. anche io ho aggiunto poche risposte a questa stessa domanda, aggiungo questa risposta come una risposta separata per essere più chiara a voi.

enter image description here

suo sporco UI, ho preparato molto rushy. Puoi vedere lo StackBar nella parte inferiore dello schermo. Viene visualizzato quando si fa clic sul pulsante OK dello AlertDialog

Ecco come l'ho fatto.

seguente codice appartiene a 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" /> 

seguente codice appartiene a 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!" /> 

seguente codice appartiene a MainActivity.java

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

Sentiti libero di chiedere tutto ciò di cui hai bisogno. In questo esempio non ho usato i frammenti. Se hai bisogno, posso aiutarti anche con quello. e inoltre posso inviare il progetto se ne hai bisogno. dammi la tua email :)

Come riassunto, quello che ho davvero fatto è, basta passare la vista Layout RooT allo SnackBar. È semplice.

Ancora una cosa ..

Secondo la Google Material Design Snackbars & Toasts Usage Riferimento

Posizionamento

snackbars appaiono sopra la maggior parte degli elementi su schermo, e sono uguali in elevazione al pulsante di azione flottante. Tuttavia, sono più bassi nell'elevazione di rispetto a finestre di dialogo, fogli di fondo e cassetti di navigazione.

Quindi lo Snackbar apparirà sempre di livello inferiore in altezza rispetto alle finestre di dialogo.

+1

Grazie per la risposta. Quello che voglio è mettere lo 'Snackbar' su' Dialog' ma, come mi hai mostrato nel tuo post, 'Snackbar' apparirà sempre di livello inferiore in altezza rispetto alle finestre di dialogo. – roroinpho21

+0

Penso che puoi segnare come risposta corretta, non è –

+0

Beh, senza offesa, ma è sì e no. Sì, perché ho rinunciato a mettere il 'Snackbar' sul dialogo e no perché se qualcuno vuole avere il' Snackbar' su overlay di dialogo questo frammento di codice non aiuterà. – roroinpho21

1

Prova questa soluzione: usati finestra materiale:
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(); 
Problemi correlati