Скрыть TabLayout и панель инструментов в некоторых фрагментах / Обработка onPause / onResume правильно - PullRequest
0 голосов
/ 04 февраля 2020

Я использую один подход «Активность» с навигационным графиком. Я не хочу, чтобы мой макет вкладки или панель инструментов были видны в некоторых фрагментах. Я написал суперкласс, чтобы расширить его в тех фрагментах, которые мне не нужны. Но почему-то я не правильно понимаю жизненный цикл, так как он не работает:

 public class NoTabLayoutFragment extends Fragment {

    @Override
    public void onResume() {
        super.onResume();
        hideTabLayout();

    }

    @Override
    public void onPause() {
        super.onPause();
        showTabLayout();
    }

    private void showTabLayout() {
        if (getActivity() != null && getActivity().findViewById(R.id.fragment_main_tab_layout) != null) {
            getActivity().findViewById(R.id.fragment_main_tab_layout).setVisibility(View.VISIBLE);
        }

    }

    private void hideTabLayout() {
        if (getActivity() != null && getActivity().findViewById(R.id.fragment_main_tab_layout) != null) {
            getActivity().findViewById(R.id.fragment_main_tab_layout).setVisibility(View.GONE);
        }

    }
}  

и

public class NoBarsFragment extends NoTabLayoutFragment {
    @Override
    public void onResume() {
        super.onResume();
        hideToolbar();
    }

    @Override
    public void onPause() {
        super.onPause();
        showToolbar();
    }

    private void hideToolbar() {
        if (getActivity() != null && ((AppCompatActivity) getActivity()).getSupportActionBar() != null) {
            ((AppCompatActivity) getActivity()).getSupportActionBar().hide();
        }
    }

    private void showToolbar() {
        if (getActivity() != null && ((AppCompatActivity) getActivity()).getSupportActionBar() != null) {
            ((AppCompatActivity) getActivity()).getSupportActionBar().show();
        }
    }
}

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Согласно документации Listen for Navigation Events , правильный способ изменить видимость пользовательского интерфейса - OnDestinationChangedListener:

navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
    @Override
    public void onDestinationChanged(@NonNull NavController controller,
           @NonNull NavDestination destination, @Nullable Bundle arguments) {
       if(destination.getId() == R.id.full_screen_destination) {
           getSupportActionBar().hide()
       } else {
           getSupportActionBar().show()
       }
   }
});
1 голос
/ 04 февраля 2020

Я выбираю другой подход:

Создать:

public interface HideBehaviourListener {

onHide();
onRestore();

}
public interface ToolbarHideListener extends HideBehaviourListener {

}
public interface TabLayoutHideListener extends HideBehaviourListener {

}

Теперь в ваш Фрагмент добавим:

public class SomeFragment {

private ToolbarHideListener toolbarListener;
private TabLayoutHideListener tabLayoutListener;

@Override
public void onAttach(final Context context) {
super.onAttach(context);
toolbarListener = (ToolbarHideListener) context;
tabLayoutListener = (TabLayoutHideListener) context;
}

public void onResume() {
toolbarListener.onHide();
tabLayoutListener.onHide();
}

public void onPause() {
toolbarListener.onRestore();
tabLayoutListener.onRestore();
}
}

Итак. В вашей Деятельности необходимо реализовать интерфейс с вашей логикой c. При таком подходе ваши фрагменты не знают никаких ресурсов или поведения деятельности.

...