Android: 有没有办法在片段中隐藏 MainActivity 布局元素?

Android: Is there a way to hide MainActivity layout elements in fragments?

我的 MainActivity 布局包含一个底部导航栏,因为我想将它用作我的应用程序片段中的主要导航组件。但是,我有一个登录页面,我不希望导航栏在该页面上可见。由于该片段是从 MainActivity 创建的,它继承了导航栏,我找不到一种方法将其隐藏在登录片段中并在后续片段中显示它。

为了方便:

  1. 我有一个带有 BottomNavigationBar 的 MainActivity 布局
  2. 所有片段从 MainActivity 布局原生继承 BottomNavigationBar
  3. 我希望导航栏的可见性在用户登录片段
  4. 上是"GONE"
  5. 我希望导航栏的可见性在剩余片段
  6. 上是"VISIBLE"

有办法吗?

我在 MainActivity 中定义 BottomNavigationBar 的原因是我最初在每个片段上都有一个单独的导航栏,这需要在每个片段上有单独的侦听器(使代码比它应该的更广泛)。此外,当我将导航栏作为每个片段中的单独组件实现时,项目选择动画不再起作用。

我曾尝试在登录片段中使用 <include layout="@layout/main_activity android:visibility="GONE" android:layout_width="match_parent" android:layout_height="wrap_content"/>,但这没有用。

我将不胜感激人们在这件事上提供的任何帮助。

如果您想查看我的任何代码,请随时告诉我。我不确定我的代码的哪些部分是相关的。

您可以使用 getActivity() 方法从片段访问 activity 并转换为您的 activity。当然,您必须将 hideBottomNavigationBar 方法添加到您的 activity 并且您还必须确保您的片段主机 activity 是 MyActivity.

MyActivity activity = ((MyActivity)getActivity());
activity.hideBottomNavigationBar();

之后,您可以定义一个名为 IFullScreen 的标记界面,然后在您的 BaseFragment 的 onCreateView 方法中,您可以检查此 class 是否是 IFullScreen 的实例,并决定显示或隐藏底部导航栏。

interface IFullScreen { }

class BaseFragment extends Fragment {

    @CallSuper
    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        MyActivity activity = ((MyActivity)getActivity());
        if (this instanceof IFullScreen)
            activity.hideBottomNavigationBar();
        else 
            activity.showBottomNavigationBar();
    }

}

class FragmentA extends BaseFragment implements IFullScreen {

    //Rest of fragment code
}

我建议您针对此案例使用单独的活动 - LoginActivityMainActivity。因为您可能会在某些时候添加 ForgotPasswordFragment 和其他内容。恕我直言,隐藏你不需要的东西是不好的做法。

如果您不想改变您的方法,您可以创建 BaseFragment,它将在每个片段中包含 abstract val showBottomNavBar()override。 然后在 onViewCreated 中,您将检查该标志并相应地更新 UI。

像这样:

abstract class BaseFragment : Fragment() {
  abstract val showBottomNavBar: Boolean
  //.. your other stuff
}

class FragmentA : BaseFragment() {
  override val showBottomNavBar = false

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    if (!showBottomNavBar) {
      (requireActivity() as YourAcitivy).hideNavBar() //this is bad
      someKindOfBroadcastManager.sendEvent(hideNavBar) // this is somewhat better
    }
  }
} 

但我仍然建议您将 login/main 逻辑与单个 activity

分离