#java #android
Насколько я понимаю при нажатии на item, которые находятся сбоку, мы открываем фрагмент. Интересует следующий вопрос:как на главную активность добавить фрагмент и замещать его при нажатии на один из итемов?
Ответы
Ответ 1
При работе со связкой Navigation Drawer + Fragments можно выделить два механизма работы приложения: При выборе в Navigation Drawer определенного фрагмента, текущий видимый фрагмент скрывается (hide) и отображается (show) выбранный фрагмент. При выборе в Navigation Drawer определенного фрагмента, текущий видимый фрагмент замещается (replace) выбранным фрагментом (см. ниже пояснение). Принципиальная разница между этими двумя подходами заключается в том, что в первом случае, скрываемый фрагмент не изменяет свое состояние и методы его жизненного цикла (при его скрытии и отображении) не вызываются. Во втором же случае, для фрагмента, который замещается будут последовательно вызваны методы его жизненного цикла: onPause(); onStop(); onDestroyView(); onDestroy(); onDetach(). Следовательно, в первом случае, при возвращении к скрытому фрагменту мы увидим его состояние на момент скрытия, а во втором случае фрагмент будет создан с нуля, то есть данные, которые находились на нем, мы уже не увидим. (пояснение): честно говоря, навскидку не могу сказать, в какой ситуации можно, а точнее нужно применять второй подход (именно при смене фрагментов из Navigation Drawer)... но чисто технически это возможно (и в каких-то случаях может даже и нужна именно такая логика работы). В подавляющем же большинстве случаев используется именно первый подход, потому как именно он наиболее логичен при использовании Navigation Drawer + Fragments: пользователь может переключаться между экранами без потери данных на них. Пусть имеются два фрагмента: FragmentA и FragmentB, ниже я приведу два метода: первый (changeFragment(...)) используется для переключения (скрытия/показа) фрагментов без потери данных, а второй (replaceFragment(...)) – для замещения одного фрагмента другим. private void changeFragment(String neededToShowFragmentTag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ListexistingFragments = fragmentManager.getFragments(); Fragment currentShownFragment = null; if (existingFragments != null) { for (Fragment fragment : existingFragments) { if (fragment.isVisible()) { currentShownFragment = fragment; break; } } } if (currentShownFragment == null || !currentShownFragment.getTag().equals(neededToShowFragmentTag)) { Fragment neededToShowFragment = fragmentManager.findFragmentByTag(neededToShowFragmentTag); if (neededToShowFragment == null) { switch (neededToShowFragmentTag) { case "fragment_a": neededToShowFragment = new FragmentA(); break; case "fragment_b": neededToShowFragment = new FragmentB(); break; } fragmentTransaction.add(R.id.fragments_container, neededToShowFragment, neededToShowFragmentTag); } if (currentShownFragment != null) { fragmentTransaction.hide(currentShownFragment); } fragmentTransaction.show(neededToShowFragment).commit(); } } private void replaceFragment(String neededToShowFragmentTag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment neededToShowFragment = fragmentManager.findFragmentByTag(neededToShowFragmentTag); if (neededToShowFragment == null) { switch (neededToShowFragmentTag) { case "fragment_a": neededToShowFragment = new FragmentA(); break; case "fragment_b": neededToShowFragment = new FragmentB(); break; } if (fragmentManager.getFragments() == null) { fragmentTransaction.add(R.id.fragments_container, neededToShowFragment, neededToShowFragmentTag); } else { fragmentTransaction.replace(R.id.fragments_container, neededToShowFragment, neededToShowFragmentTag); } fragmentTransaction.commit(); } } Далее размещаю layout-файлы и код всех классов, дабы Вы смогли легко у себя все это собрать и посмотреть разницу. menu_main.xml: activity_main.xml: fragment_a.xml: fragment_b.xml: FragmentA: public class FragmentA extends Fragment { private TextView mTextView; private Button mButton; private int i = 0; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_a, container, false); mTextView = (TextView) view.findViewById(R.id.fragment_a_text_view); mButton = (Button) view.findViewById(R.id.fragment_a_button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i++; mTextView.setText("Фрагмент A : " + i); } }); return view; } } FragmentB: public class FragmentB extends Fragment { private TextView mTextView; private Button mButton; private int i = 0; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_b, container, false); mTextView = (TextView) view.findViewById(R.id.fragment_b_text_view); mButton = (Button) view.findViewById(R.id.fragment_b_button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i++; mTextView.setText("Фрагмент B : " + i); } }); return view; } } MainActivity: public class MainActivity extends AppCompatActivity { private final String FRAGMENT_A_TAG = "fragment_a"; private final String FRAGMENT_B_TAG = "fragment_b"; private DrawerLayout mDrawerLayout; private NavigationView mNavigationView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mNavigationView = (NavigationView) findViewById(R.id.navigation_view); mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { int itemId = item.getItemId(); switch (itemId) { case R.id.menu_main_fragment_a: replaceFragment(FRAGMENT_A_TAG); mDrawerLayout.closeDrawers(); return true; case R.id.menu_main_fragment_b: replaceFragment(FRAGMENT_B_TAG); mDrawerLayout.closeDrawers(); return true; } return false; } }); } private void changeFragment(String neededToShowFragmentTag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); List existingFragments = fragmentManager.getFragments(); Fragment currentShownFragment = null; if (existingFragments != null) { for (Fragment fragment : existingFragments) { if (fragment.isVisible()) { currentShownFragment = fragment; break; } } } if (currentShownFragment == null || !currentShownFragment.getTag().equals(neededToShowFragmentTag)) { Fragment neededToShowFragment = fragmentManager.findFragmentByTag(neededToShowFragmentTag); if (neededToShowFragment == null) { switch (neededToShowFragmentTag) { case "fragment_a": neededToShowFragment = new FragmentA(); break; case "fragment_b": neededToShowFragment = new FragmentB(); break; } fragmentTransaction.add(R.id.fragments_container, neededToShowFragment, neededToShowFragmentTag); } if (currentShownFragment != null) { fragmentTransaction.hide(currentShownFragment); } fragmentTransaction.show(neededToShowFragment).commit(); } } private void replaceFragment(String neededToShowFragmentTag) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment neededToShowFragment = fragmentManager.findFragmentByTag(neededToShowFragmentTag); if (neededToShowFragment == null) { switch (neededToShowFragmentTag) { case "fragment_a": neededToShowFragment = new FragmentA(); break; case "fragment_b": neededToShowFragment = new FragmentB(); break; } if (fragmentManager.getFragments() == null) { fragmentTransaction.add(R.id.fragments_container, neededToShowFragment, neededToShowFragmentTag); } else { fragmentTransaction.replace(R.id.fragments_container, neededToShowFragment, neededToShowFragmentTag); } fragmentTransaction.commit(); } } }
Комментариев нет:
Отправить комментарий