2017-04-09 144 views
1

我有一個BottomNavigationView活動。在我把網頁視圖的片段,但問題是,用戶無法點擊,因爲我BottomNavigationView的上底部的網頁內容,沒有任何一個建議我一個很好的解決方案如何隱藏/顯示webview期間的底部導航視圖滾動

screenshot

這是我activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 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/container" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.hackerinside.jaisonjoseph.polysocial.MainActivity"> 

<FrameLayout 
    android:id="@+id/content" 
    android:layout_width="match_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    android:background="@android:color/holo_blue_dark"> 

    <TextView 
     android:id="@+id/message" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginBottom="@dimen/activity_vertical_margin" 
     android:layout_marginLeft="@dimen/activity_horizontal_margin" 
     android:layout_marginRight="@dimen/activity_horizontal_margin" 
     android:layout_marginTop="@dimen/activity_vertical_margin" 
     /> 

</FrameLayout> 


<android.support.design.widget.BottomNavigationView 
    android:id="@+id/navigation" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_gravity="bottom" 
    android:background="?android:attr/windowBackground" 
    android:layout_alignParentBottom="true" 
    app:menu="@menu/navigation" /> 

這是我的WebView片段

<LinearLayout 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:orientation="vertical" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
tools:context="com.hackerinside.jaisonjoseph.polysocial.tab1"> 


<FrameLayout 
    android:id="@+id/frame1" 
    android:layout_width="match_parent" 
    android:layout_height="3dp" 
    android:background="@android:color/transparent"> 


    <ProgressBar 
     android:id="@+id/progressBar1" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="3dp" 
     android:background="@android:color/transparent" 
     android:foregroundGravity="top" 
     android:progressDrawable="@drawable/custom_progress" 
     android:progress="20"/> 

</FrameLayout> 


<android.support.v4.widget.SwipeRefreshLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/swiperefresh1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 






    <com.hackerinside.jaisonjoseph.polysocial.EulaWebView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/webview" 
     android:focusable="true" 
     android:focusableInTouchMode="true" /> 



</android.support.v4.widget.SwipeRefreshLayout> 

after adding answer

回答

1

拉昇BottomNavigationView,讓你可以滾動過程中隱藏一個自定義滾動行爲。

Link

public final class BottomNavigationBehavior<V extends View> extends VerticalScrollingBehavior<V> { 
    private static final Interpolator INTERPOLATOR = new LinearOutSlowInInterpolator(); 
    private final BottomNavigationWithSnackbar mWithSnackBarImpl = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? new LollipopBottomNavWithSnackBarImpl() : new PreLollipopBottomNavWithSnackBarImpl(); 
    private boolean isTablet; 
    private int mTabLayoutId; 
    private boolean hidden = false; 
    private ViewPropertyAnimatorCompat mOffsetValueAnimator; 
    private ViewGroup mTabLayout; 
    private View mTabsHolder; 
    private int mSnackbarHeight = -1; 
    private boolean scrollingEnabled = true; 
    private boolean hideAlongSnackbar = false; 
    int[] attrsArray = new int[] { 
      android.R.attr.id }; 
    public BottomNavigationBehavior() { 
     super(); 
    } 

    public BottomNavigationBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     TypedArray a = context.obtainStyledAttributes(attrs, 
       attrsArray); 
     mTabLayoutId = a.getResourceId(0, View.NO_ID); 
     a.recycle(); 
    } 

    public static <V extends View> BottomNavigationBehavior<V> from(@NonNull V view) { 
     ViewGroup.LayoutParams params = view.getLayoutParams(); 
     if (!(params instanceof CoordinatorLayout.LayoutParams)) { 
      throw new IllegalArgumentException("The view is not a child of CoordinatorLayout"); 
     } 
     CoordinatorLayout.Behavior behavior = ((CoordinatorLayout.LayoutParams) params) 
       .getBehavior(); 
     if (!(behavior instanceof BottomNavigationBehavior)) { 
      throw new IllegalArgumentException(
        "The view is not associated with BottomNavigationBehavior"); 
     } 
     return (BottomNavigationBehavior<V>) behavior; 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) { 
     mWithSnackBarImpl.updateSnackbar(parent, dependency, child); 
     return dependency instanceof Snackbar.SnackbarLayout; 
    } 

    @Override 
    public void onDependentViewRemoved(CoordinatorLayout parent, V child, View dependency) { 
     updateScrollingForSnackbar(dependency, child, true); 
     super.onDependentViewRemoved(parent, child, dependency); 
    } 

    private void updateScrollingForSnackbar(View dependency, V child, boolean enabled) { 
     if (!isTablet && dependency instanceof Snackbar.SnackbarLayout) { 
      scrollingEnabled = enabled; 
      if (!hideAlongSnackbar && ViewCompat.getTranslationY(child) != 0) { 
       ViewCompat.setTranslationY(child, 0); 
       hidden = false; 
       hideAlongSnackbar = true; 
      }else if(hideAlongSnackbar){ 
       hidden = true; 
       animateOffset(child, -child.getHeight()); 
      } 
     } 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) { 
     updateScrollingForSnackbar(dependency, child, false); 
     return super.onDependentViewChanged(parent, child, dependency); 
    } 

    @Override 
    public boolean onLayoutChild(CoordinatorLayout parent, V child, int layoutDirection) { 
     boolean layoutChild = super.onLayoutChild(parent, child, layoutDirection); 
     if (mTabLayout == null && mTabLayoutId != View.NO_ID) { 
      mTabLayout = findTabLayout(child); 
      getTabsHolder(); 
     } 

     return layoutChild; 
    } 

    @Nullable 
    private ViewGroup findTabLayout(@NonNull View child) { 
     if (mTabLayoutId == 0) return null; 
     return (ViewGroup) child.findViewById(mTabLayoutId); 
    } 

    @Override 
    public void onNestedVerticalOverScroll(CoordinatorLayout coordinatorLayout, V child, @ScrollDirection int direction, int currentOverScroll, int totalOverScroll) { 
    } 

    @Override 
    public void onDirectionNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, int dx, int dy, int[] consumed, @ScrollDirection int scrollDirection) { 
     handleDirection(child, scrollDirection); 
    } 

    private void handleDirection(V child, @ScrollDirection int scrollDirection) { 
     if (!scrollingEnabled) return; 
     if (scrollDirection == ScrollDirection.SCROLL_DIRECTION_DOWN && hidden) { 
      hidden = false; 
      animateOffset(child, 0); 
     } else if (scrollDirection == ScrollDirection.SCROLL_DIRECTION_UP && !hidden) { 
      hidden = true; 
      animateOffset(child, child.getHeight()); 
     } 
    } 

    @Override 
    protected boolean onNestedDirectionFling(CoordinatorLayout coordinatorLayout, V child, View target, float velocityX, float velocityY, @ScrollDirection int scrollDirection) { 
     handleDirection(child, scrollDirection); 
     return true; 
    } 

    private void animateOffset(final V child, final int offset) { 
     ensureOrCancelAnimator(child); 
     mOffsetValueAnimator.translationY(offset).start(); 
     animateTabsHolder(offset); 
    } 

    private void animateTabsHolder(int offset) { 
     if (mTabsHolder != null) { 
      offset = offset > 0 ? 0 : 1; 
      ViewCompat.animate(mTabsHolder).alpha(offset).setDuration(200).start(); 
     } 
    } 

    private void ensureOrCancelAnimator(V child) { 
     if (mOffsetValueAnimator == null) { 
      mOffsetValueAnimator = ViewCompat.animate(child); 
      mOffsetValueAnimator.setDuration(100); 
      mOffsetValueAnimator.setInterpolator(INTERPOLATOR); 
     } else { 
      mOffsetValueAnimator.cancel(); 
     } 
    } 

    private void getTabsHolder() { 
     if (mTabLayout != null) { 
      mTabsHolder = mTabLayout.getChildAt(0); 
     } 
    } 

    public boolean isScrollingEnabled() { 
     return scrollingEnabled; 
    } 

    public void setScrollingEnabled(boolean scrollingEnabled) { 
     this.scrollingEnabled = scrollingEnabled; 
    } 

    public void setHidden(V view, boolean bottomLayoutHidden) { 
     if (!bottomLayoutHidden && hidden) { 
      animateOffset(view, 0); 
     } else if (bottomLayoutHidden && !hidden) { 
      animateOffset(view, -view.getHeight()); 
     } 
     hidden = bottomLayoutHidden; 
    } 

    private interface BottomNavigationWithSnackbar { 
     void updateSnackbar(CoordinatorLayout parent, View dependency, View child); 
    } 

    private class PreLollipopBottomNavWithSnackBarImpl implements BottomNavigationWithSnackbar { 

     @Override 
     public void updateSnackbar(CoordinatorLayout parent, View dependency, View child) { 
      if (!isTablet && dependency instanceof Snackbar.SnackbarLayout) { 
       if (mSnackbarHeight == -1) { 
        mSnackbarHeight = dependency.getHeight(); 
       } 

       int targetPadding = child.getMeasuredHeight(); 

       int shadow = (int) ViewCompat.getElevation(child); 
       ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) dependency.getLayoutParams(); 
       layoutParams.bottomMargin = targetPadding - shadow; 
       child.bringToFront(); 
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
        child.getParent().requestLayout(); 
        ((View) child.getParent()).invalidate(); 
       } 

      } 
     } 
    } 

    private class LollipopBottomNavWithSnackBarImpl implements BottomNavigationWithSnackbar { 

     @Override 
     public void updateSnackbar(CoordinatorLayout parent, View dependency, View child) { 
      if (!isTablet && dependency instanceof Snackbar.SnackbarLayout) { 
       if (mSnackbarHeight == -1) { 
        mSnackbarHeight = dependency.getHeight(); 
       } 
       int targetPadding = (mSnackbarHeight + 
         child.getMeasuredHeight()); 
       dependency.setPadding(dependency.getPaddingLeft(), 
         dependency.getPaddingTop(), dependency.getPaddingRight(), targetPadding 
       ); 
      } 
     } 
    } 
} 

將其應用於自己的看法:

<android.support.design.widget.BottomNavigationView 
    android:id="@+id/bottom_navigation" 
    android:layout_gravity="bottom" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    app:itemBackground="@color/colorPrimary" 
    app:itemIconTint="@color/white" 
    app:itemTextColor="@color/white" 
    app:layout_behavior=".BottomNavigationBehavior" //apply the behaviour 
    app:menu="@menu/bottom_navigation_main" /> 

輸出:

enter image description here

+0

現在導航視圖已經:( –

+0

它不工作的兄弟,在添加你的代碼之後,它就消失了,導航 –

+0

你沒有添加'Framelayout' ......你沒有用你的webview片段替換Framelayout ......? – rafsanahmad007