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