Я хочу динамически перемещаться между фрагментами.Мой код работает в основном нормально.Но на некоторых устройствах Android происходит непредвиденное поведение.
Ниже приведен скелет моего фрагмента:
public class MyFragment extends Fragment {
public View inflatedViewFromActivity;
private int fragmentID = -1;
boolean firstTime = true;
public void setFragmentID(int id) {
this.fragmentID = id;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflatedViewFromActivity;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
if(firstTime) {
// create and add some views to root
}
firstTime = false;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.e("@@LOG", "onCreateOptionsMenu " + fragmentID);
// create toolbar items
super.onCreateOptionsMenu(menu,inflater);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
// do something on toolbar items
}
@Override
public boolean onContextItemSelected(MenuItem item){
Log.e("@@LOG", "onContextItemSelected " + fragmentID);
// handle up button
return false;
}
@Override
public void onResume() {
Log.e("@@LOG", "onResume " + fragmentID);
super.onResume();
}
@Override
public void onPause() {
Log.e("@@LOG", "onPause " + fragmentID);
super.onPause();
}
}
Журналы жизненного цикла выглядят нормально для следующих шагов.
- Открыть приложение
- Заменить фрагмент 1 (фрагмент ID = 1)
- Заменить фрагмент 2 (фрагмент ID = 2)
- Заменить фрагмент 3 (фрагмент ID= 3)
- Заменить фрагмент 4 (фрагмент ID = 4)
onResume вызывается обратный вызов фрагмента 4.Иногда фрагмент 3 перемещается из макета действия, но фрагмент 4 не отображается вместо фрагмента 3.
Журнал жизненного цикла находится здесь:
2019-09-19 14:19:15.423 24671-24671/io.com.ex E/@@LOG: onCreateView 1
2019-09-19 14:19:15.628 24671-24671/io.com.ex E/@@LOG: onResume 1
2019-09-19 14:19:15.834 24671-24671/io.com.ex E/@@LOG: onCreateOptionsMenu 1
2019-09-19 14:19:18.988 24671-24671/io.com.ex E/@@LOG: onPause 1
2019-09-19 14:19:18.998 24671-24671/io.com.ex E/@@LOG: onCreateView 2
2019-09-19 14:19:19.068 24671-24671/io.com.ex E/@@LOG: onResume 2
2019-09-19 14:19:19.082 24671-24671/io.com.ex E/@@LOG: onCreateOptionsMenu 2
2019-09-19 14:19:23.046 24671-24671/io.com.ex E/@@LOG: onPause 2 2
2019-09-19 14:19:23.053 24671-24671/io.com.ex E/@@LOG: onCreateView 3
2019-09-19 14:19:23.644 24671-24671/io.com.ex E/@@LOG: onResume 3
2019-09-19 14:19:23.669 24671-24671/io.com.ex E/@@LOG: onCreateOptionsMenu 3
2019-09-19 14:19:30.245 24671-24671/io.com.ex E/@@LOG: onPause 3
2019-09-19 14:19:30.256 24671-24671/io.com.ex E/@@LOG: onCreateView 4
2019-09-19 14:19:30.291 24671-24671/io.com.ex E/@@LOG: onResume 4
Заменить код:
rootView = this.getLayoutInflater().inflate(R.layout.fragment_layout, null);
fragmentInstance.inflatedViewFromActivity = rootView;
fragmentManager = activity.getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(activityLayoutID, fragmentInstance);
fragmentTransaction.commitAllowingStateLoss();
fragmentManager.executePendingTransactions();