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