У меня есть XML для активности, и у меня есть android: id = "@ + id/fragment_container" FrameLayout, который я использую для добавления фрагментов.Почему Back on Fragment не работает?
Я в настоящее время есть два фрагмента
[GameManager], [PlayerStatus]
Вот фрагмент из XML с контейнером
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dip" >
я добавить фрагмент [GameManager], как следует из основного вида деятельности:
//Start the fragment
Fragment gameManager = new GameManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container,gameManager)
.addToBackStack(null)
.commit();
Из класса GameManager Фрагмент, добавить новый фрагмент в контейнер следующим образом при нажатии кнопки:
public boolean buttonPress(Type button) {
boolean canBuild = false;
Player player = board.getCurrentPlayer();
switch (button) {
case INFO:
//INFO IS THE BUTTON THAT IS ALWAYS VISIBLE IN TOP LEFT CORNER
Log.d("myTag", "about to launch PLAYER INFO");
PlayerStatus playerStatus = new PlayerStatus();
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, playerStatus);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
.
.
.
В GameManager I setContentView следующим образом, где localgame.xml является XML цитированной выше:
@Override
public void onCreate(Bundle state) {
super.onCreate(state);
setContentView(R.layout.localgame);
Все работает до такой степени, что я нажимаю кнопку «Назад», чтобы вернуться к первому фрагменту.
В основной деятельности у меня есть следующий код, который проверяет кнопку назад:
@Override
public void onBackPressed() {
Log.d("myTag", "DETECTED BACK");
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
Log.d("myTag", "THERE WAS SOMETHING IN THE FRAGSTACK");
getSupportFragmentManager().popBackStack();
getSupportFragmentManager().beginTransaction().commit();
} else {
super.onBackPressed();
}
}
}
Вопрос заключается в том, что при нажатии на кнопку назад, спина определяется правильно, и я также можно увидеть, что там было что-то поп(), но второй фрагмент не закрывается. Он просто остается видимым. Я хочу, чтобы, когда мы нажимаем кнопку назад из фрагмента [playerStatus], мы возвращаемся к фрагменту [GameManager].
Любые советы приветствуются!
Edit: После внесения изменений, предложенных Мартин, я получаю следующее:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.settlers.hd, PID: 12710
java.lang.IllegalArgumentException: No view found for id 0x7f070025 (com.settlers.hd:id/fragment_container) for fragment GameManager{c2a128d #0 id=0x7f070025 GameManager}
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:930)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:764)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1527)
at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:485)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:446)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5551)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
Вам не нужно переопределять 'onBackPressed()' в классе активности. Когда вы нажмете кнопку «Назад», она автоматически поместит фрагмент назад. – arjun
После того, как popBackStack не выполнил эту транзакцию. – azizbekian
@arjun Я также пробовал без переопределения, и он по-прежнему кажется поп, но не закрывает фрагмент. – ProgrammedChem