Просмотр проблемы, вызывающей SecondFragment из FirstFragment

Я делаю простой демонстрационный проект с использованием Fragments , в которых я SecondFragment из FirstFragment при нажатии кнопки.

И я назвал SecondFragment без каких-либо проблем, но я getting view of both the Fragments SecondFragment и FirstFragment

Итак, где я делаю ошибку?

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction() .add(R.id.container, new FirstFragment()).commit(); } } public static class FirstFragment extends Fragment { Button buttonCallSecondFragment; public FirstFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_first, container, false); buttonCallSecondFragment = (Button) rootView.findViewById(R.id.button1); buttonCallSecondFragment.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub FragmentManager fm = getFragmentManager(); SecondFragment fragment = new SecondFragment(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.container, fragment); ft.commit(); } }); return rootView; } } public static class SecondFragment extends Fragment { public SecondFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_second, container, false); return rootView; } } } 

Вам нужно удалить первый фрагмент, вы можете сделать это либо с помощью replace либо с первого вызова, а затем add

Чтобы иметь возможность нажать кнопку «Назад», добавьте транзакцию в задний стек, вы делаете это, вызывая addToBackStack(tag) в вашем менеджере фрагментов. Тег может быть нулевым.

Вы добавляете фрагмент, который уже показывает фрагмент в вашем приложении для Android.

  FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.container, fragment); ft.commit(); 

Не добавляйте фрагмент, но замените фрагмент, когда уже загружен один фрагмент активности.

Поэтому для реализации этого:

Добавьте код в OnCreate () и добавьте код ниже для вашего слушателя кликов:

  FragmentManager fm = getFragmentManager(); SecondFragment fragment = new SecondFragment(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.container, fragment); ft.addToBackStack(null); ft.commit(); 

Спасибо.!!

Если вы хотите заменить фрагмент, вы должны вызывать замену вместо add:

 buttonCallSecondFragment = (Button) rootView.findViewById(R.id.button1); buttonCallSecondFragment.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub FragmentManager fm = getFragmentManager(); SecondFragment fragment = new SecondFragment(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.container, fragment); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); ft.addToBackStack(null); ft.commit(); } }); 

Вы добавляете фрагмент, чтобы он попадал поверх другого фрагмента, давая цвет фона для rootview фрагмента scecond

Вы также можете загрузить это как вложенный фрагмент

 public void addFragB() { FragmentManager childFragMan = getChildFragmentManager(); FragmentTransaction childFragTrans = childFragMan.beginTransaction(); SecondFragment 2ndfrag = new SecondFragment(); childFragTrans.add(R.id.fragA_LinearLayout, 2ndfrag); //childFragTrans.addToBackStack(""); childFragTrans.commit(); } 

Нет, вы не можете общаться между такими фрагментами. Вы должны общаться между фрагментами через активность контейнера.

Я предлагаю, вы делаете навигационный метод в своей деятельности и переключаете / вызываете между фрагментами оттуда.

Ниже представлен небольшой фрагмент:

В вашей работе с контейнером:

 Fragment fragment; public void navigateTo(Fragment newFragment,boolean addToBackStack) { this.fragment = newFragment; FragmentManager manager = getSupportFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.replace(R.id.fragment_container, newFragment); if(addToBackStack) ft.addToBackStack(fragment.getClass().getSimpleName()); ft.commit(); } 

Если вы перейдете из Fragment1 в Fragment2, то в своем Fragment1 сделайте следующее:

 ((YourContainerActivity) getActivity()).navigateTo(new Fragment2(),false); //if you want to add to back stack make 2nd argument true. 
 private void selectItem(int position) { selectedPosition = position; // update the main content by replacing fragments fragment = null; fragmentStack = new Stack<Fragment>(); switch (position) { case 0: fragment = new Fragment1(); break; case 1: fragment = new Fragment2(); break; } //redirect the screen if (fragment != null) { fragmentManager = getSupportFragmentManager(); redirectScreen(fragment); // update selected item and title, then close the drawer mDrawerList.setItemChecked(position, true); mDrawerList.setSelection(position); setTitle(title[position]); mDrawerLayout.closeDrawer(mDrawerList); } }