2015-11-11 2 views
3

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

ответ

3

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

Я начал с шаблона активности приложения Android Studio Navigation Drawer (создайте новое действие и выберите одно для навигационного ящика). Он создал FAB поверх основного макета контента. Внутри этого макета у меня есть контейнер, в который я ввожу и вставляю фрагменты. Когда я не хочу, чтобы FAB показывал, я вызываю FloatingActionButton.hide(...) в Activity, а затем 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 метода I настройки своей деятельности в щелчок слушателя для 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; 
     } 
    } 
}); 

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

+1

У меня это работает по-другому: в каждом фрагменте метода onCreateView я помещаю код, устанавливающий видимость FAB в GONE или VISIBLE в зависимости от фрагмента. getMainActivity(). MButton_adicionar.setVisibility (View.VISIBLE); –

+0

Это выглядит проще. – geniusburger

Смежные вопросы