Android: Есть ли способ скрыть элементы макета MainActivity во фрагментах? - PullRequest
0 голосов
/ 06 февраля 2020

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

Для простоты:

  1. У меня есть макет MainActivity с BottomNavigationBar
  2. Все фрагменты изначально наследуют BottomNavigationBar из макета MainActivity
  3. Я хочу, чтобы видимость панели навигации была "Унесена" на фрагмент логина пользователя
  4. Я хочу, чтобы на оставшихся фрагментах видимость панели навигации была «ВИДИМОЙ»

Есть ли способ сделать это?

Причина, по которой я определяю BottomNavigationBar в MainActivity, заключается в том, что у меня изначально была отдельная панель навигации для каждого фрагмента, что требовало отдельных слушателей для каждого фрагмента (делая код более обширным, чем он должен быть). Кроме того, когда я реализовал панель навигации в качестве отдельного компонента в каждом фрагменте, анимации, выбранные элементом, больше не функционировали.

Я пытался использовать <include layout="@layout/main_activity android:visibility="GONE" android:layout_width="match_parent" android:layout_height="wrap_content"/> из фрагмента входа в систему, но это не сработало.

Буду признателен за любую помощь людям в этом вопросе.

Пожалуйста, не стесняйтесь, дайте мне знать, если вы хотите увидеть любой из моего кода. Я не был уверен, какие части моего кода будут актуальны.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я бы предложил вам использовать отдельные действия для этого случая - LoginActivity и MainActivity. Так как вы можете в какой-то момент добавить ForgotPasswordFragment и, возможно, что-то еще. Во-первых, прятать то, что вам не нужно, - плохая практика. ИМХО.

Если вы не хотите менять свой подход, вы можете создать BaseFragment, который будет иметь abstract val showBottomNavBar() и будет * 1008. * это в каждом фрагменте. А затем в onViewCreated вы проверите этот флаг и соответственно обновите пользовательский интерфейс.

Что-то вроде этого:

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

Но я все равно предложил бы вам отсоединить логин / основной лог c от одного занятия

0 голосов
/ 06 февраля 2020

Вы можете получить доступ к активности из фрагмента с помощью метода getActivity () и привести его к своей активности. Конечно, вы должны добавить метод hideBottomNavigationBar к своей активности, а также должны быть уверены, что вашим хостом фрагментов является MyActivity.

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

После этого вы можете определить интерфейс маркера с именем IFullScreen, затем в вашем BaseFragment Метод onCreateView позволяет проверить, является ли этот класс экземпляром 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...