Как скрыть нижнюю навигационную панель в фрагменте - PullRequest
0 голосов
/ 20 мая 2019

У меня есть нижняя навигационная панель в Главном действии. У меня есть три фрагмента, связанные с панелью BottomNavigation в фрагментах, которые я имею в представлении переработчика, поэтому я хочу скрыть панель BottomNavigation, когда RecyclerView прокручивается вниз, и показывает, когда RecyclerView прокручивается вверх. Моя проблема в том, как я могу получить доступ к панели BottomNavigation во фрагментах, потому что она определена в MainActivity.

Это мой код:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp"
    android:background="@color/colorPrimary"
    android:paddingBottom="7dp"
    android:fitsSystemWindows="true">


    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        app:layout_scrollFlags="scroll|enterAlways|snap">

        <Spinner
            android:layout_width="110dp"
            android:layout_height="50dp"
            android:id="@+id/chooseLocation"
            app:backgroundTint="@android:color/white"/>

    </android.support.v7.widget.Toolbar>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"
        android:id="@+id/search"
        android:paddingTop="6dp"
        android:paddingBottom="6dp"
        android:paddingRight="6dp"
        android:paddingLeft="12dp"
        android:hint="Search here"
        android:textColorHint="#9e9e9e"
        android:textColor="#000"
        tools:ignore="HardcodedText"
        android:background="@drawable/search_edit_text"
        android:paddingEnd="6dp"
        android:paddingStart="12dp"/>

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_main" />

<android.support.design.widget.BottomNavigationView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/bottomBar"
    android:layout_gravity="bottom"
    app:menu="@menu/bottom_menu"
    android:background="#fff"
    app:itemIconTint="@drawable/nav_check"
    app:itemTextColor="@drawable/nav_check"/>

</android.support.design.widget.CoordinatorLayout>

fragment_home.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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"
tools:context=".Tab1Fragment"
android:background="#fff">

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/purchasedBook"/>


</RelativeLayout>

Так определяются мои фрагменты, так как ни в одной из них нет нижней навигационной панели, так как я могу получить доступ к нижней навигационной панели в фрагментах.

Кто-то, пожалуйста, дайте мне знать, что любая помощь будет признательна.

СПАСИБО

Ответы [ 5 ]

1 голос
/ 20 мая 2019

Для доступа к вашему BottomNavigationView из фрагментов используйте следующий код:

BottomNavigationView navBar = getActivity().findViewById(R.id.bottomBar);
1 голос
/ 20 мая 2019

Попробуйте это,

Добавьте эту строку в BottomNavigationView в Xml

Приложение: layout_behavior = "@ строка / hide_bottom_view_on_scroll_behavior"

И реализуйте это поведение BottomNavigation, используя CoOrdinator Layout, и вы можете скрыть или показать представление с помощью слушателей прокрутки.

public class BottomNavigationViewBehavior extends CoordinatorLayout.Behavior<BottomNavigationView> {

private int height;

@Override
public boolean onLayoutChild(CoordinatorLayout parent, BottomNavigationView child, int layoutDirection) {
    height = child.getHeight();
    return super.onLayoutChild(parent, child, layoutDirection);
}

@Override
public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout,
                               BottomNavigationView child, @NonNull 
                               View directTargetChild, @NonNull View target,
                               int axes, int type)
{
    return axes == ViewCompat.SCROLL_AXIS_VERTICAL;
}

@Override
public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull BottomNavigationView child,
           @NonNull View target, int dxConsumed, int dyConsumed,
           int dxUnconsumed, int dyUnconsumed, 
            @ViewCompat.NestedScrollType int type)
{
   if (dyConsumed > 0) {
       slideDown(child);
   } else if (dyConsumed < 0) {
       slideUp(child);
   }
}

private void slideUp(BottomNavigationView child) {
    child.clearAnimation();
    child.animate().translationY(0).setDuration(200);
}

private void slideDown(BottomNavigationView child) {
    child.clearAnimation();
    child.animate().translationY(height).setDuration(200);
}

}

Добавьте этот код строки в свою активность, где он содержит нижнюю навигацию

bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_nav);
CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) 
bottomNavigationView .getLayoutParams();
layoutParams.setBehavior(new BottomNavigationViewBehavior());

Попробуйте и дайте мне знать Digvijay.Happy Coding.

0 голосов
/ 20 мая 2019

Добавить

app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"

в

BottomNavigationView

app:layout_behavior="@string/appbar_scrolling_view_behavior"

в

RecyclerView

0 голосов
/ 20 мая 2019

Фрагмент имеет onAttach() метод, который дает вам контекст.Таким образом, вы должны создать экземпляр действия, используя,

MainActivity mainActivity;
@Override
public void onAttach(Context context) {
    super.onAttach(context);
    mainActivity = (MainActivity)context;
}

Теперь создайте метод с параметром boolean, который скрывает и показывает нижнюю панель.

public void visibilityOfBottom(boolean isScroll){
  if(isScroll){

  // hide bottom bar

  } else{
   // show bottom bar
  }

}

Теперь доступ к методу выше во фрагменте, используяMainActivity context by,

mainActivity.visibilityOfBottom(false);
0 голосов
/ 20 мая 2019

Поскольку фрагмент всегда находится внутри действия, и вы можете вызвать getActivity() во фрагменте, чтобы получить доступ к объектам, которые уже существуют в действии. так что вы можете сделать это:

Активность

public class MainActivity extends Activity {
//...
   Toolbar toolbar;
//...
   public Toolbar getNav() {
      return toolbar;
   }
//...
}

Фрагмент

//...
if(getActivity() != null && getActivity instanceOf MainActivity)
    ((MainActivity)getActivity).getNav.setVisiblity(View.GONE);
//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...