Плавающая кнопка действия в двух фрагментах

Я хочу поместить плавающую кнопку действия (FAB) с двумя действиями (одинаковыми для обоих фрагментов) в 2 фрагмента. Проблема в том, что у меня только одно действие и много фрагментов (больше, чем этих 2). Как лучше всего это сделать? Создание FAB в основном XML или дублирование его в обоих фрагментах?


person Christiane Okamoto    schedule 11.11.2015    source источник


Ответы (1)


В настоящее время я работаю над приложением с некоторыми похожими проблемами, вот что я сделал.

Я начал с шаблона действия ящика навигации Android Studio (создайте новое действие и выберите тот, который будет использоваться для ящика навигации). Он создал FAB поверх основного макета контента Activity. Внутри этого макета у меня есть контейнер, в котором я меняю местами фрагменты. Когда я не хочу, чтобы FAB отображался, я вызываю FloatingActionButton.hide (...) в действии, а затем FloatingActionButton.show (), когда я захочу его вернуть.

Это требует, чтобы вы знали, какой фрагмент в настоящее время виден, поэтому вы должны указать тег при настройке транзакции фрагмента:

getFragmentManager()
    .beginTransaction()
    .replace(R.id.fragment_container, EditTaskFragment.newInstance(true), FRAGMENT_EDIT)
    .addToBackStack(null)
    .commit();

Где FRAGMENT_EDIT определяется как:

private static final String FRAGMENT_EDIT = "edit";

Когда вы фиксируете транзакцию, вы можете вызвать методы FAB show или hide. Обратите внимание, что для этого также может потребоваться прослушивание события нажатия кнопки возврата:

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        if (getFragmentManager().getBackStackEntryCount() > 0){
            EditTaskFragment editFragment = (EditTaskFragment)getFragmentManager().findFragmentByTag(FRAGMENT_EDIT);
            if (editFragment != null && editFragment.isVisible()) {
                // coming back from edit, reset fab to add icon
                setFabIcon(R.drawable.ic_add_24dp);
            }
            getFragmentManager().popBackStack();
        } else if(null == mTaskFragment || !mTaskFragment.cancelRefreshData()) {
            super.onBackPressed();
        }
    }
}

setFabIcon используется, чтобы скрыть FAB (анимацию сжатия), изменить значок, а затем показать его снова (анимация роста):

private void setFabIcon(final int resId) {
    fab.hide(new FloatingActionButton.OnVisibilityChangedListener() {
        @Override
        public void onHidden(FloatingActionButton fab) {
            fab.setImageResource(resId);
            fab.show();
        }
    });
}

Внутри метода onCreate Activity я настраиваю прослушиватель кликов для FAB и проверяю, в какой фрагмент я должен передать вызов:

fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Fragment currentFragment = getFragmentManager().findFragmentById(R.id.fragment_container);
        String tag = currentFragment.getTag();
        switch (tag) {
            case FRAGMENT_TASKS:
                Snackbar.make(view, "Task creation is...under construction", Snackbar.LENGTH_LONG).show();
                break;
            case FRAGMENT_TURNS:
                ((TurnFragment) currentFragment).takeTurn(view);
                break;
            case FRAGMENT_EDIT:
                ((EditTaskFragment) currentFragment).saveTask();
                break;
            default:
                Log.e(TAG, "Unhandled FAB fragment tag " + tag);
                Snackbar.make(view, "Not sure what to do...my bad", Snackbar.LENGTH_SHORT).show();
                break;
        }
    }
});

Обратите внимание, что каждый из вызываемых мною фрагментов предоставляет открытый метод, который, как ожидается, вызовет Activity.

person geniusburger    schedule 11.11.2015
comment
У меня это работает по-другому: в каждом фрагменте метода onCreateView я помещаю код, устанавливающий видимость FAB на GONE или VISIBLE в зависимости от фрагмента. getMainActivity (). mButton_adicionar.setVisibility (View.VISIBLE); - person Christiane Okamoto; 12.11.2015
comment
Это кажется проще. - person geniusburger; 20.01.2016