Browse Source

[공통][New] NavigationBar 추가
- ActionBar 의 UI 및 이벤트만 별도로 이용할 수 있다.

hyodong.min 7 năm trước cách đây
mục cha
commit
794620b656

+ 7 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/manager/ActionBarManager.java

@@ -96,8 +96,6 @@ public class ActionBarManager {
 
     clickListenerMap = new HashMap<>();
 
-//    disableShowHideAnimation(actionBar);
-
     LayoutInflater inflater = LayoutInflater.from(activity);
     View view = inflater.inflate(R.layout.action_bar, null);
 
@@ -161,11 +159,13 @@ public class ActionBarManager {
    */
   public void setScrollListener(IActionBarListener.Scroll scrollListener) {
     this.scrollListener = scrollListener;
-    if (null == scrollListener) {
-      this.appBarLayout.removeOnOffsetChangedListener(onOffsetChangedListener);
-    }
-    else {
-      this.appBarLayout.addOnOffsetChangedListener(onOffsetChangedListener);
+    if (null != this.appBarLayout) {
+      if (null == scrollListener) {
+        this.appBarLayout.removeOnOffsetChangedListener(onOffsetChangedListener);
+      }
+      else {
+        this.appBarLayout.addOnOffsetChangedListener(onOffsetChangedListener);
+      }
     }
   }
 

+ 20 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/manager/INavigationBarListener.java

@@ -0,0 +1,20 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.manager;
+
+/**
+ * INavigationBarListener
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 1.]   [최초 작성]
+ * @since 2018. 11. 1.
+ */
+
+
+public interface INavigationBarListener {
+  void onClick(NavigationBar navigationBar);
+}

+ 503 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/manager/NavigationBar.java

@@ -0,0 +1,503 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.manager;
+
+import android.content.Context;
+import android.support.annotation.StringRes;
+import android.support.v4.graphics.drawable.DrawableCompat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.HashMap;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
+
+/**
+ * NavigationBar
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 10. 24.]   [최초 작성]
+ * @since 2018. 10. 24.
+ */
+public class NavigationBar {
+  private View view;
+
+  private TextView actionBarTitle;
+  private ImageView imageBi;
+  private ImageView buttonBack;
+  private ImageView buttonSearch;
+  private ImageView buttonMenu;
+
+  private ImageView buttonArrow;
+  private ImageView buttonHome;
+  private ImageView buttonNotification;
+  private ImageView buttonSetting;
+  private ImageView buttonClose;
+  private TextView textButton;
+
+  private boolean isArrowOpened = false;
+
+  private HashMap<View, INavigationBarListener> clickListenerMap;
+
+  private NavigationBar(Context context) {
+
+    LayoutInflater inflater = LayoutInflater.from(context);
+    this.view = inflater.inflate(R.layout.action_bar, null);
+
+    init();
+  }
+
+
+  private void init() {
+    clickListenerMap = new HashMap<>();
+
+    actionBarTitle = view.findViewById(R.id.action_bar_title);
+    buttonArrow = view.findViewById(R.id.button_open_arrow);
+    imageBi = view.findViewById(R.id.image_bi);
+    buttonSearch = view.findViewById(R.id.button_search);
+    buttonMenu = view.findViewById(R.id.button_menu);
+    buttonBack = view.findViewById(R.id.button_back);
+
+    buttonHome = view.findViewById(R.id.button_home);
+    buttonNotification = view.findViewById(R.id.button_notification);
+    buttonSetting = view.findViewById(R.id.button_setting);
+    buttonClose = view.findViewById(R.id.button_close);
+    textButton = view.findViewById(R.id.text_sub);
+
+    setClickListener(buttonBack);
+    setClickListener(buttonSearch);
+    setClickListener(buttonMenu);
+    setClickListener(actionBarTitle);
+    setClickListener(buttonHome);
+    setClickListener(buttonNotification);
+    setClickListener(buttonSetting);
+    setClickListener(buttonClose);
+    setClickListener(textButton);
+
+  }
+
+  private void setClickListener(View view) {
+    view.setOnClickListener(v -> {
+      INavigationBarListener listener = clickListenerMap.get(v);
+      if (null != listener) {
+        listener.onClick(this);
+      }
+    });
+  }
+
+  private void mapClickListener(View view, INavigationBarListener listener) {
+    clickListenerMap.put(view, listener);
+  }
+
+
+  /**
+   * actionbar 제목 설정
+   *
+   * @param stringId
+   */
+  private void setTitle(@StringRes int stringId) {
+    actionBarTitle.setText(stringId);
+  }
+
+  /**
+   * 타이틀 보이기
+   * - setTitle() 해서 설정도 해줘야함.
+   *
+   * @param isVisible
+   */
+  private void setTitleVisible(boolean isVisible) {
+    setViewVisible(actionBarTitle, isVisible);
+  }
+
+  /**
+   * 백 버튼 보이기
+   *
+   * @param isVisible
+   */
+  private void setBackVisible(boolean isVisible) {
+    setViewVisible(buttonBack, isVisible);
+  }
+
+  /**
+   * BI(Lifeplus) 보이기
+   *
+   * @param isVisible
+   */
+  private void setBiVisible(boolean isVisible) {
+    setViewVisible(imageBi, isVisible);
+  }
+
+  /**
+   * 검색 버튼 보이기
+   *
+   * @param isVisible
+   */
+  private void setSearchVisible(boolean isVisible) {
+    setViewVisible(buttonSearch, isVisible);
+  }
+
+  private void setHomeVisible(boolean isVisible) {
+    setViewVisible(buttonHome, isVisible);
+  }
+
+  private void setAlarmVisible(boolean isVisible) {
+    setViewVisible(buttonNotification, isVisible);
+  }
+
+  private void setSettingVisible(boolean isVisible) {
+    setViewVisible(buttonSetting, isVisible);
+  }
+
+  private void setCloseVisible(boolean isVisible) {
+    setViewVisible(buttonClose, isVisible);
+  }
+
+  private void setTextButtonVisible(boolean isVisible) {
+    setViewVisible(textButton, isVisible);
+  }
+
+  private void setArrowVisible(boolean isVisible) {
+    setViewVisible(buttonArrow, isVisible, View.GONE);
+  }
+
+  /**
+   * 메뉴 버튼 보이기
+   *
+   * @param isVisible
+   */
+  private void setMenuVisible(boolean isVisible) {
+    setViewVisible(buttonMenu, isVisible);
+  }
+
+  private void setViewVisible(View view, boolean isVisible) {
+    if (null != view) {
+      setViewVisible(view, isVisible, View.INVISIBLE);
+    }
+  }
+
+  private void setViewVisible(View view, boolean isVisible, int visibility) {
+    if (null != view) {
+      view.setVisibility(isVisible ? View.VISIBLE : visibility);
+    }
+  }
+
+  private void setBackgroundTransparent(boolean isTransparent) {
+    view.setBackgroundResource(isTransparent ? android.R.color.transparent : R.color.C80FFFFFF);
+  }
+
+  private void set(Builder newBuilder) {
+    setMenuVisible(newBuilder.isVisibleMenu);
+    mapClickListener(buttonMenu, newBuilder.menuListener);
+
+    setSearchVisible(newBuilder.isVisibleSearch);
+    mapClickListener(buttonSearch, newBuilder.searchListener);
+
+    setBiVisible(newBuilder.isVisibleBi);
+
+    setBackVisible(newBuilder.isVisibleBack);
+    mapClickListener(buttonBack, newBuilder.backListener);
+
+    setTitleVisible(newBuilder.isVisibleTitle);
+    setTitle(newBuilder.title);
+    mapClickListener(actionBarTitle, newBuilder.titleListener);
+
+    setBackgroundTransparent(newBuilder.isTransparentBackground);
+
+    setWhiteUi(newBuilder.isWhite);
+
+    setHomeVisible(newBuilder.isVisibleHome);
+    mapClickListener(buttonHome, newBuilder.homeListener);
+
+    setAlarmVisible(newBuilder.isVisibleNotification);
+    mapClickListener(buttonNotification, newBuilder.notificationListener);
+
+    setSettingVisible(newBuilder.isVisibleSetting);
+    mapClickListener(buttonSetting, newBuilder.settingListener);
+
+    setCloseVisible(newBuilder.isVisibleClose);
+    mapClickListener(buttonClose, newBuilder.closeListener);
+
+    setTextButtonVisible(newBuilder.isVisibleTextButton);
+    textButton.setText(newBuilder.text);
+    mapClickListener(textButton, newBuilder.textButtonListener);
+
+    setArrowVisible(newBuilder.isVisibleArrow);
+    if (null != newBuilder.arrowListener) {
+      buttonArrow.setOnClickListener(v -> {
+        if (isArrowOpened) {
+          // to close
+          buttonArrow.setImageResource(R.drawable.icon_h_down);
+        }
+        else {
+          // to open
+          buttonArrow.setImageResource(R.drawable.icon_header_up);
+        }
+        isArrowOpened = !isArrowOpened;
+        newBuilder.arrowListener.onClick(NavigationBar.this);
+      });
+    }
+  }
+
+  private void setWhiteUi(boolean isWhite) {
+    int color;
+    if (isWhite) {
+      color = ResourceUtil.getColor(R.color.CFFFFFF);
+      actionBarTitle.setTextColor(color);
+      DrawableCompat.setTint(buttonBack.getDrawable(), color);
+      DrawableCompat.setTint(imageBi.getDrawable(), color);
+      DrawableCompat.setTint(buttonBack.getDrawable(), color);
+      DrawableCompat.setTint(buttonSearch.getDrawable(), color);
+      DrawableCompat.setTint(buttonMenu.getDrawable(), color);
+    }
+    else {
+      color = ResourceUtil.getColor(R.color.C000000);
+      actionBarTitle.setTextColor(color);
+      DrawableCompat.setTint(buttonBack.getDrawable(), color);
+      DrawableCompat.setTint(imageBi.getDrawable(), color);
+      DrawableCompat.setTint(buttonBack.getDrawable(), color);
+      DrawableCompat.setTint(buttonSearch.getDrawable(), color);
+      DrawableCompat.setTint(buttonMenu.getDrawable(), color);
+    }
+  }
+
+  /***********************************
+   * public
+   ***********************************/
+  /**
+   * show
+   */
+  public void show() {
+    setViewVisible(view, true, View.GONE);
+  }
+
+  /**
+   * hide
+   */
+  public void hide() {
+    setViewVisible(view, false, View.GONE);
+  }
+
+  /**
+   * view 반환
+   *
+   * @return
+   */
+  public View getView() {
+    return view;
+  }
+
+  /**
+   * 화살표 (타이틀 옆) 열림/닫힘 확인
+   *
+   * @return
+   */
+  public boolean isArrowOpened() {
+    return isArrowOpened;
+  }
+
+  /***********************************
+   * Builder
+   ***********************************/
+  public static class Builder {
+
+    private final Context context;
+    private boolean isVisibleTitle = false;
+    private boolean isVisibleBack = false;
+    private boolean isVisibleBi = false;
+    private boolean isVisibleSearch = false;
+    private boolean isVisibleMenu = false;
+    private int title = R.string.empty_string;
+    private boolean isTransparentBackground = false;
+    private boolean isWhite = false;
+    private boolean isVisibleArrow = false;
+
+    private boolean isVisibleHome = false;
+    private boolean isVisibleNotification = false;
+    private boolean isVisibleSetting = false;
+    private boolean isVisibleClose = false;
+    private boolean isVisibleTextButton = false;
+    private int text = R.string.empty_string;
+
+    private INavigationBarListener backListener = null;
+    private INavigationBarListener bookmarkListener = null;
+    private INavigationBarListener likeListener = null;
+    private INavigationBarListener menuListener = null;
+    private INavigationBarListener searchListener = null;
+    private INavigationBarListener shareListener = null;
+    private INavigationBarListener titleListener = null;
+
+    private INavigationBarListener homeListener = null;
+    private INavigationBarListener notificationListener = null;
+    private INavigationBarListener settingListener = null;
+    private INavigationBarListener closeListener = null;
+    private INavigationBarListener textButtonListener = null;
+    private INavigationBarListener arrowListener = null;
+
+    public Builder(Context context) {
+      this.context = context;
+    }
+
+    /**
+     * 타이틀 표시
+     *
+     * @param stringId @StringRes
+     * @return Builder
+     */
+    public Builder title(@StringRes int stringId, INavigationBarListener titleListener) {
+      this.title = stringId;
+      isVisibleTitle = true;
+      this.titleListener = titleListener;
+      return this;
+    }
+
+    public Builder title(@StringRes int stringId) {
+      return title(stringId, null);
+    }
+
+    /**
+     * back button
+     *
+     * @return Builder
+     */
+    public Builder back(INavigationBarListener backListener) {
+      isVisibleBack = true;
+      this.backListener = backListener;
+      return this;
+    }
+
+    /**
+     * logo
+     *
+     * @return Builder
+     */
+    public Builder logo() {
+      isVisibleBi = true;
+      return this;
+    }
+
+    /**
+     * search button
+     *
+     * @return Builder
+     */
+    public Builder search(INavigationBarListener searchListener) {
+      isVisibleSearch = true;
+      this.searchListener = searchListener;
+      return this;
+    }
+
+    /**
+     * menu (burger)
+     *
+     * @return Builder
+     */
+    public Builder menu(INavigationBarListener menuListener) {
+      isVisibleMenu = true;
+      this.menuListener = menuListener;
+      return this;
+    }
+
+    /**
+     * 배경 투명하게
+     *
+     * @return Builder
+     */
+    public Builder transparent() {
+      isTransparentBackground = true;
+      return this;
+    }
+
+    /**
+     * 홈
+     *
+     * @return Builder
+     */
+    public Builder home(INavigationBarListener homeListener) {
+      isVisibleHome = true;
+      this.homeListener = homeListener;
+      return this;
+    }
+
+    /**
+     * 알림
+     *
+     * @return Builder
+     */
+    public Builder notification(INavigationBarListener notificationListener) {
+      isVisibleNotification = true;
+      this.notificationListener = notificationListener;
+      return this;
+    }
+
+    /**
+     * 세팅
+     *
+     * @return Builder
+     */
+    public Builder setting(INavigationBarListener settingListener) {
+      isVisibleSetting = true;
+      this.settingListener = settingListener;
+      return this;
+    }
+
+    /**
+     * 닫기
+     *
+     * @return Builder
+     */
+    public Builder close(INavigationBarListener closeListener) {
+      isVisibleClose = true;
+      this.closeListener = closeListener;
+      return this;
+    }
+
+    /**
+     * 텍스트 버튼 (닫기 버튼 옆)
+     *
+     * @return Builder
+     */
+    public Builder textButton(@StringRes int stringId, INavigationBarListener textButtonListener) {
+      text = stringId;
+      isVisibleTextButton = true;
+      this.textButtonListener = textButtonListener;
+      return this;
+    }
+
+    /**
+     * arrow (타이틀 옆)
+     *
+     * @return Builder
+     */
+    public Builder arrow(INavigationBarListener arrowListener) {
+      isVisibleArrow = true;
+      this.arrowListener = arrowListener;
+      return this;
+    }
+
+    /**
+     * UI 흰색 사용
+     *
+     * @return Builder
+     */
+    public Builder white() {
+      isWhite = true;
+      return this;
+    }
+
+    public NavigationBar build() {
+      NavigationBar navigationBar = new NavigationBar(context);
+      navigationBar.set(this);
+      navigationBar.show();
+      return navigationBar;
+    }
+
+  }
+}
+

+ 11 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainFragment.java

@@ -71,9 +71,15 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     contentsRecyclerView.addOnScrollListener(scrollListener);
     contentsRecyclerView.addItemDecoration(new PagerIndicatorDecoration(getContext()));
 
-    ActionBarManager.getInstance().setScrollListener(actionBarScrollListener);
+//    ActionBarManager.getInstance().setScrollListener(actionBarScrollListener);
 
 
+//    NavigationBar bar = new NavigationBar.Builder(getContext()).logo()
+//      .menu(navigationBar -> presenter.onClickMenu(null))
+//      .search(navigationBar -> presenter.onClickSearch(null))
+//      .build();
+//
+//    ((ViewGroup) findViewById(R.id.container_navigation_bar)).addView(bar.getView());
     // --------------- test ------------------
 
     View button;
@@ -165,7 +171,7 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
 
     contentsRecyclerView.removeOnScrollListener(scrollListener);
 
-    ActionBarManager.getInstance().setScrollListener(null);
+//    ActionBarManager.getInstance().setScrollListener(null);
   }
 
   @Override
@@ -173,7 +179,9 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     ActionBarManager.getInstance().begin().logo()
       .menu(actionBar -> presenter.onClickMenu(actionBar))
       .search(actionBar -> presenter.onClickSearch(actionBar))
-      .scroll().show();
+      .scroll()
+      .show();
+
   }
 
   private void clearData() {

+ 7 - 0
app/src/main/res/layout/fragment_main.xml

@@ -179,4 +179,11 @@
     </LinearLayout>
   </LinearLayout>
 
+  <android.support.constraint.ConstraintLayout
+    android:id="@+id/container_navigation_bar"
+    android:background="@null"
+    android:layout_width="match_parent"
+    android:layout_height="@dimen/action_bar_height">
+
+  </android.support.constraint.ConstraintLayout>
 </android.support.constraint.ConstraintLayout>