web-dev-qa-db-fra.com

Peut-on effectuer 2 actions différentes dans Snack bar à la fois sous Android?

Je crée une application Android dans laquelle je veux utiliser Snack Bar, Dans un snack, je veux 2 mots différents sur lesquels nous devons effectuer 2 actions différentes.

 enter image description here

17
Anjali Patel

A partir du Spécifications de conception Google :

Chaque casse-croûte peut contenir une seule action, ni «Dismiss» ni «Cancel»

Pour plusieurs actions, utilisez une boîte de dialogue.

17
Elias N

Merci Shailesh, j'ai dû modifier le code afin de le faire fonctionner pour moi.

my_snackbar.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="horizontal"
    Android:id="@+id/my_snackbar_layout"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:background="@color/dark_grey"
    Android:padding="15dp">

    <TextView
        Android:id="@+id/message_text_view"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_weight=".6"
        Android:gravity="center_vertical"
        Android:text="Two button snackbar"
        Android:textColor="@color/white"/>

    <TextView
        Android:id="@+id/first_text_view"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_weight=".2"
        Android:gravity="center"
        Android:text="ONE"
        Android:textColor="#FFDEAD"/>

    <TextView
        Android:id="@+id/second_text_view"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:layout_weight=".2"
        Android:gravity="center"
        Android:text="TWO"
        Android:textColor="#FFDEAD"/>

</LinearLayout> 

Dans votre activité, appelez cette méthode chaque fois que vous souhaitez afficher le snack-bar:

 private void showTwoButtonSnackbar() {

    // Create the Snackbar
    LinearLayout.LayoutParams objLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    snackbar = Snackbar.make(this.findViewById(Android.R.id.content), message, Snackbar.LENGTH_INDEFINITE);

    // Get the Snackbar layout view
    Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();

    // Set snackbar layout params
    int navbarHeight = getNavBarHeight(this);
    FrameLayout.LayoutParams parentParams = (FrameLayout.LayoutParams) layout.getLayoutParams();
    parentParams.setMargins(0, 0, 0, 0 - navbarHeight + 50);
    layout.setLayoutParams(parentParams);
    layout.setPadding(0, 0, 0, 0);
    layout.setLayoutParams(parentParams);

    // Inflate our custom view
    View snackView = getLayoutInflater().inflate(R.layout.my_snackbar, null);

    // Configure our custom view
    TextView messageTextView = (TextView) snackView.findViewById(R.id.message_text_view);
    messageTextView.setText(message);

    TextView textViewOne = (TextView) snackView.findViewById(R.id.first_text_view);
    textViewOne.setText("ALLOW");
    textViewOne.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("Allow", "showTwoButtonSnackbar() : allow clicked");
            snackbar.dismiss();
        }
    });

    TextView textViewTwo = (TextView) snackView.findViewById(R.id.second_text_view);
    textViewTwo.setText("DENY");
    textViewTwo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("Deny", "showTwoButtonSnackbar() : deny clicked");
            snackbar.dismiss();
        }
    });

    // Add our custom view to the Snackbar's layout
    layout.addView(snackView, objLayoutParams);

    // Show the Snackbar
    snackbar.show();
}

Pour obtenir la hauteur de la barre de navigation:

public static int getNavBarHeight(Context context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "Android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
} 
3
Ashwin

Comme @Elias N, chaque réponse Snackbar peut contenir une seule action. Si vous souhaitez définir plus d’actions que dans Snackbar, vous devez créer votre propre présentation. S'il vous plaît essayez ceci, j'espère que cela vous aidera.

Créer un fichier xml my_snackbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
              Android:orientation="horizontal"
              Android:layout_width="match_parent"
              Android:layout_height="50dp"
              Android:background="#000000">
    <TextView
        Android:layout_width="0dp"
        Android:layout_height="50dp"
        Android:layout_weight=".7"
        Android:gravity="center_vertical"
        Android:text="Please select any one"
        Android:textColor="@color/white"/>

    <TextView
        Android:id="@+id/txtOne"
        Android:layout_width="0dp"
        Android:layout_height="50dp"
        Android:layout_weight=".1"
        Android:gravity="center"
        Android:text="ONE"
        Android:textColor="@color/red"/>
    <TextView
        Android:id="@+id/txtTwo"
        Android:layout_width="0dp"
        Android:layout_height="50dp"
        Android:layout_weight=".1"
        Android:gravity="center"
        Android:text="TWO"
        Android:textColor="@color/red"/>
</LinearLayout>

Maintenant, dans votre fichier d’activité, faites le code suivant.

public void myCustomSnackbar()
{
    // Create the Snackbar
    LinearLayout.LayoutParams objLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    Snackbar snackbar = Snackbar.make(llShow, "", Snackbar.LENGTH_LONG);
    // Get the Snackbar's layout view
    Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) snackbar.getView();
    layout.setPadding(0,0,0,0);
    // Hide the text
    TextView textView = (TextView) layout.findViewById(Android.support.design.R.id.snackbar_text);
    textView.setVisibility(View.INVISIBLE);

    LayoutInflater mInflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
    // Inflate our custom view
    View snackView = getLayoutInflater().inflate(R.layout.my_snackbar, null);
    // Configure the view
    TextView textViewOne = (TextView) snackView.findViewById(R.id.txtOne);

    textViewOne.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("One", "First one is clicked");
        }
    });

    TextView textViewTwo = (TextView) snackView.findViewById(R.id.txtTwo);
    textViewTwo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        Log.i("Two", "Second one is clicked");
        }
    });

    // Add the view to the Snackbar's layout
    layout.addView(snackView, objLayoutParams);
    // Show the Snackbar
    snackbar.show();
}

Pour plus de détails, veuillez lire cette documentation et ici .

2
Shailesh

Une autre solution de contournement que vous pourriez essayer (fonctionne dans mon cas).

    final Snackbar snackbar = Snackbar.make(view, "UNDO MARKED AS READ", Snackbar.LENGTH_LONG);
    snackbar.setAction("DISMISS", new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (snackbar != null)
                snackbar.dismiss();
        }
    });
    View snackbarView = snackbar.getView();
    int snackbarTextId = Android.support.design.R.id.snackbar_text;
    TextView textView = (TextView) snackbarView.findViewById(snackbarTextId);
    textView.setTextColor(Color.WHITE);
    textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (snackbar != null)
                snackbar.dismiss();
            // undo mark as unread code
        }
    });
    snackbar.show();
0
John Domnic George

Vous pouvez utiliser BottomSheetDialog et le déguiser en SnackBar. La seule différence serait qu'il sera supprimé en glissant vers le bas au lieu de droit et qu'il puisse rester là jusqu'à ce que l'utilisateur l'ait rejeté pendant que la SnackBar s'efface.

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/fragment_history_menu_bottom"
    style="@style/Widget.Design.BottomNavigationView"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center_horizontal"
    Android:orientation="horizontal"
    Android:background="@color/cardview_dark_background"
    app:layout_behavior="Android.support.design.widget.BottomSheetBehavior">


    <Android.support.v7.widget.AppCompatTextView
        Android:id="@+id/appCompatTextView"
        Android:layout_width="wrap_content"
        Android:layout_height="19dp"
        Android:layout_gravity="center_vertical"

        Android:layout_marginStart="8dp"
        Android:layout_weight="0.6"
        Android:text="Load More ?"
        Android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
        Android:textColor="@color/cardview_light_background"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <LinearLayout
        Android:id="@+id/fragment_history_bottom_sheet_delete"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_gravity="right|end"
        Android:layout_weight="0.4"
        Android:clickable="true"
        Android:focusable="true"
        Android:foreground="?android:attr/selectableItemBackground"
        Android:orientation="horizontal"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

        <Android.support.v7.widget.AppCompatButton
            style="@style/Widget.AppCompat.Button.Borderless.Colored"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Yes" />

        <Android.support.v7.widget.AppCompatButton
            style="@style/Widget.AppCompat.Button.Borderless"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="No"
            Android:textColor="@color/cardview_light_background" />
    </LinearLayout>
</Android.support.constraint.ConstraintLayout>

et l'utiliser comme suit (Kotlin)

val dialog = BottomSheetDialog(this)
    dialog.setContentView(this.layoutInflater.inflate(R.layout.bottom_sheet_load_Prompt,null))
    dialog.show()

le résultat sera similaire à SnackBar

 Similar to SnackBar

0
Jatin Dhankhar