Замена / добавление транзакции фрагмента - проблема с пустым экраном - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу динамически перемещаться между фрагментами.Мой код работает в основном нормально.Но на некоторых устройствах 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();
...