android-fragments 如何在片段中隐藏底部导航栏

prdp8dxp  于 2022-11-14  发布在  Android
关注(0)|答案(9)|浏览(361)

我在Main Activity中定义了底部导航栏。我有三个片段与BottomNavigation栏链接。在片段中我有回收器视图,所以我希望在RecyclerView向下滚动时隐藏BottomNavigation栏,在RecyclerView向上滚动时显示。我的问题是如何访问片段中的BottomNavigation栏,因为它是在MainActivity中定义的。
这是我的代码:

活动主文件.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>

片段_主目录.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>

这就是我的片段是如何定义的,因为在任何片段中都没有底部导航栏,所以我如何才能访问片段中的底部导航栏。
有人,请让我知道任何帮助将不胜感激。
"谢谢"

m2xkgtsf

m2xkgtsf1#

navController.addOnDestinationChangedListener { _, destination, _ ->
   if(destination.id == R.id.full_screen_destination) {
       
       bottomNavigationView.visibility = View.GONE
   } else {
       
       bottomNavigationView.visibility = View.VISIBLE
   }
}

在主Activity中执行此操作。这里R.id.full_screen_destination是导航片段中片段的id。

0h4hbjxa

0h4hbjxa2#

若要从片段中访问BottomNavigationView,请使用以下代码:

BottomNavigationView navBar = getActivity().findViewById(R.id.bottomBar);
0s0u357o

0s0u357o3#

因为fragment总是在Activity中,所以你可以在fragment中调用getActivity()来访问Activity中已经存在的对象。

活动

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

片段

//...
if(getActivity() != null && getActivity instanceOf MainActivity)
    ((MainActivity)getActivity()).getNav().setVisiblity(View.GONE);
//...
bwntbbo3

bwntbbo34#

试试这个,
在Xml格式的BottomNavigationView中添加此行
应用程序:layout_behavior="@字符串/滚动时隐藏底部视图行为”
并使用CoOrdinator Layout实现此BottomNavigation行为,您可以使用滚动侦听器隐藏或显示视图。

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

}
将此行代码添加到包含底部导航Activity中

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

试试这个,让我知道Digvijay。编码快乐。

zujrkrfu

zujrkrfu5#

Fragment有onAttach()方法,它给予上下文。因此,您必须使用以下方法创建Activity的示例:

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上下文访问片段中上述方法,方法为:

mainActivity.visibilityOfBottom(false);
6yoyoihd

6yoyoihd6#

Kotlin
从片段访问导航视图

val navBar: BottomNavigationView = activity!!.findViewById(R.id.bottomBar)
qxgroojn

qxgroojn7#

我发现在V6中隐藏底部导航器的唯一方法是这样做-

Stack Nav {
   Bottom Nav
   Screen 1
   Screen 2
   Screen 3
}
blpfk2vs

blpfk2vs8#

将此代码添加到您的片段。将隐藏底部导航。

AppCompatActivity activity = (AppCompatActivity) view.getContext();
    chipNavigationBar = activity.findViewById(R.id.chipNavigation);
    chipNavigationBar.animate().translationY(chipNavigationBar.getHeight()).setDuration(1000);

使用此代码:当向下滚动到你的片段时,回收视图将隐藏底部导航。然后当向上滚动时,它将显示底部导航。

private View view;
private AppCompatActivity activity;
private ChipNavigationBar chipNavigationBar;
//...............................................

@Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (view == null) {
            view = inflater.inflate(R.layout.list_fragment, container, false);
         hide_NavigationBar_adwhen_Scrolling();
        }
        return view;
    }

//...........................................................

private void hide_NavigationBar_adwhen_Scrolling() {
        activity = (AppCompatActivity) view.getContext();
        chipNavigationBar = activity.findViewById(R.id.chipNavigation);

        RecyclerView recyclerView = view.findViewById(R.id.recylerView);
       recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (dy > 0) {//on_Scrolled_down
                //  chipNavigationBar.animate().translationY(200).setDuration(500);
               chipNavigationBar.animate().translationY(banner_ad_card_1.getHeight()).setDuration(1000);

            } else {//on_Scrolled_up
                 chipNavigationBar.setVisibility(View.VISIBLE);
                chipNavigationBar.animate().translationY(0).setDuration(1000);
                //  chipNavigationBar.setItemSelected(R.id.home, true);
            }
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }
    });
    }
tuwxkamq

tuwxkamq9#

新增

app:layout_behavior="@string/hide_bottom_view_on_scroll_behavior"


底部导航视图

app:layout_behavior="@string/appbar_scrolling_view_behavior"


循环检视

相关问题