Android: 有没有办法在片段中隐藏 MainActivity 布局元素?
Android: Is there a way to hide MainActivity layout elements in fragments?
我的 MainActivity 布局包含一个底部导航栏,因为我想将它用作我的应用程序片段中的主要导航组件。但是,我有一个登录页面,我不希望导航栏在该页面上可见。由于该片段是从 MainActivity 创建的,它继承了导航栏,我找不到一种方法将其隐藏在登录片段中并在后续片段中显示它。
为了方便:
- 我有一个带有 BottomNavigationBar 的 MainActivity 布局
- 所有片段从 MainActivity 布局原生继承 BottomNavigationBar
- 我希望导航栏的可见性在用户登录片段
上是"GONE"
- 我希望导航栏的可见性在剩余片段
上是"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
}
我建议您针对此案例使用单独的活动 - LoginActivity
和 MainActivity
。因为您可能会在某些时候添加 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
分离
我的 MainActivity 布局包含一个底部导航栏,因为我想将它用作我的应用程序片段中的主要导航组件。但是,我有一个登录页面,我不希望导航栏在该页面上可见。由于该片段是从 MainActivity 创建的,它继承了导航栏,我找不到一种方法将其隐藏在登录片段中并在后续片段中显示它。
为了方便:
- 我有一个带有 BottomNavigationBar 的 MainActivity 布局
- 所有片段从 MainActivity 布局原生继承 BottomNavigationBar
- 我希望导航栏的可见性在用户登录片段 上是"GONE"
- 我希望导航栏的可见性在剩余片段 上是"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
}
我建议您针对此案例使用单独的活动 - LoginActivity
和 MainActivity
。因为您可能会在某些时候添加 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
分离