From 63c67c328e52684fbcd3ddcd4b856713d62052a5 Mon Sep 17 00:00:00 2001 From: Kyriakos Date: Fri, 22 Dec 2017 20:08:59 +0200 Subject: [PATCH 1/6] Added multiple actions and custom view Can now add multiple actions on the Snackbar (3 actions limit) and a custom view --- TSnackBar.iml | 2 +- app/app.iml | 42 +++---- .../tsnackbar/MainActivity.java | 3 +- .../androidadvance/topsnackbar/TSnackbar.java | 110 +++++++++++++++--- .../res/layout/tsbackbar_layout_action.xml | 20 ++++ .../res/layout/tsnackbar_layout_include.xml | 18 +-- topsnackbar/topsnackbar.iml | 29 ++--- 7 files changed, 149 insertions(+), 75 deletions(-) create mode 100644 topsnackbar/src/main/res/layout/tsbackbar_layout_action.xml diff --git a/TSnackBar.iml b/TSnackBar.iml index a0991f4..4e0a7b7 100644 --- a/TSnackBar.iml +++ b/TSnackBar.iml @@ -1,5 +1,5 @@ - + diff --git a/app/app.iml b/app/app.iml index 4e05b37..57098cb 100644 --- a/app/app.iml +++ b/app/app.iml @@ -1,5 +1,5 @@ - + @@ -9,7 +9,6 @@ - + @@ -45,7 +44,6 @@ - @@ -53,7 +51,6 @@ - @@ -61,25 +58,22 @@ - - - - - - - - - - + + + + + + + @@ -107,15 +101,15 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/androidadvance/tsnackbar/MainActivity.java b/app/src/main/java/com/androidadvance/tsnackbar/MainActivity.java index 9179dc2..b80b69b 100644 --- a/app/src/main/java/com/androidadvance/tsnackbar/MainActivity.java +++ b/app/src/main/java/com/androidadvance/tsnackbar/MainActivity.java @@ -43,8 +43,7 @@ public void onClick(View v) { button_example_2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - - + TSnackbar snackbar = TSnackbar .make(relative_layout_main, "Had a snack at Snackbar", TSnackbar.LENGTH_LONG) .setAction("Undo", new View.OnClickListener() { diff --git a/topsnackbar/src/main/java/com/androidadvance/topsnackbar/TSnackbar.java b/topsnackbar/src/main/java/com/androidadvance/topsnackbar/TSnackbar.java index 8319ae0..c7bf674 100644 --- a/topsnackbar/src/main/java/com/androidadvance/topsnackbar/TSnackbar.java +++ b/topsnackbar/src/main/java/com/androidadvance/topsnackbar/TSnackbar.java @@ -123,6 +123,7 @@ public boolean handleMessage(Message message) { private final SnackbarLayout mView; private int mDuration; private Callback mCallback; + private boolean Cancelable = true; private TSnackbar(ViewGroup parent) { mParent = parent; @@ -281,17 +282,62 @@ private static Bitmap getBitmap(Drawable drawable) { } } + /** + * Set the snackbar to auto dismiss or not after selecting action + * + * @param flag auto dismiss flag + */ + public void setCancelable(boolean flag) { + Cancelable = flag; + } + + /** + * Inflate a new action (Button) + * + * @return The new action + */ + private Button inflateAction() { + LayoutInflater inflater = LayoutInflater.from(mContext); + Button action = (Button) inflater.inflate(R.layout.tsbackbar_layout_action,null); + return action; + } + + public void setView (int layoutResId) { + LayoutInflater inflater = LayoutInflater.from(mContext); + View view = inflater.inflate(layoutResId,null); + + if(view != null) { + final LinearLayout actionView = mView.getActionHolderView(); + actionView.addView(view); + } + } + + public void setView (View view) { + if(view == null) + return; + + final LinearLayout actionView = mView.getActionHolderView(); + actionView.addView(view); + } - @NonNull public TSnackbar setAction(@StringRes int resId, View.OnClickListener listener) { return setAction(mContext.getText(resId), listener); } - @NonNull - public TSnackbar setAction(CharSequence text, final View.OnClickListener listener) { - final TextView tv = mView.getActionView(); + public TSnackbar setAction(CharSequence text, final View.OnClickListener listener) + { + final LinearLayout actionView = mView.getActionHolderView(); + if(actionView.getChildCount() >= 3) //Limit 3 actions at most. If more actions needed inflate a custom view + return this; + + Button action = inflateAction(); + if(action == null) + return this; + + actionView.addView(action); + final TextView tv = action; if (TextUtils.isEmpty(text) || listener == null) { tv.setVisibility(View.GONE); @@ -303,30 +349,49 @@ public TSnackbar setAction(CharSequence text, final View.OnClickListener listene @Override public void onClick(View view) { listener.onClick(view); - - dispatchDismiss(Callback.DISMISS_EVENT_ACTION); + + if(Cancelable) + dispatchDismiss(Callback.DISMISS_EVENT_ACTION); } }); } return this; } - @NonNull - public TSnackbar setActionTextColor(ColorStateList colors) { - final TextView tv = mView.getActionView(); + public TSnackbar setActionTextColor(ColorStateList colors, int index) { + + final Button action = mView.getActionView(index); + if(action == null) + return this; + + final TextView tv = action; tv.setTextColor(colors); return this; } - @NonNull - public TSnackbar setActionTextColor(@ColorInt int color) { - final TextView tv = mView.getActionView(); + public TSnackbar setActionTextColor(ColorStateList colors) { + return setActionTextColor(colors,0); + } + + @NonNull + public TSnackbar setActionTextColor(@ColorInt int color, int index) { + + final Button action = mView.getActionView(index); + if(action == null) + return this; + + final TextView tv = action; tv.setTextColor(color); return this; } + @NonNull + public TSnackbar setActionTextColor(@ColorInt int color) { + return setActionTextColor(color,0); + } + @NonNull public TSnackbar setText(@NonNull CharSequence message) { @@ -616,7 +681,7 @@ private boolean isBeingDragged() { public static class SnackbarLayout extends LinearLayout { private TextView mMessageView; - private Button mActionView; + private LinearLayout mActionView; private int mMaxWidth; private int mMaxInlineActionWidth; @@ -666,17 +731,32 @@ public SnackbarLayout(Context context, AttributeSet attrs) { protected void onFinishInflate() { super.onFinishInflate(); mMessageView = (TextView) findViewById(R.id.snackbar_text); - mActionView = (Button) findViewById(R.id.snackbar_action); + //mActionView = (Button) findViewById(R.id.snackbar_action); + mActionView = (LinearLayout)findViewById(R.id.snackbar_actions_holder); } TextView getMessageView() { return mMessageView; } - Button getActionView() { + LinearLayout getActionHolderView() { return mActionView; } + Button getActionView() + { + return getActionView(0); + } + + Button getActionView(int index) + { + final LinearLayout actionHolderView = getActionHolderView(); + int childCount = actionHolderView.getChildCount(); + if(childCount > 0) + return (Button)actionHolderView.getChildAt(index); + + return null; + } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); diff --git a/topsnackbar/src/main/res/layout/tsbackbar_layout_action.xml b/topsnackbar/src/main/res/layout/tsbackbar_layout_action.xml new file mode 100644 index 0000000..7ba2e4d --- /dev/null +++ b/topsnackbar/src/main/res/layout/tsbackbar_layout_action.xml @@ -0,0 +1,20 @@ + +