Обработчик onViewCreated убивает анимацию фрагмента

#android #multithreading #animation #fragment #handler

#Android #многопоточность #Анимация #фрагмент #обработчик

Вопрос:

У меня есть простой фрагмент с этим в методе onViewCreated:

     @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        if (account != null) {
            try {

                Handler handler = new Handler(Looper.getMainLooper());
                handler.postDelayed(() ->
                {
                    String decryptedCode;
                    try {
                        decryptedCode = (vaultService).getDecryptedPassword(account).trim();
                        in_password.setText(decryptedCode);
                    } catch (Exception e) {
                        Helper.showMessage(e.toString());
                    } finally {
                        in_password_layout.setHelperText("");
                    }
                }, 1);


       
            } catch (Exception e) {
                Helper.showMessage(e.toString());
            }
        }


    }

  

и вызов функции, которую я имею:

     protected void openFragment(BaseFragment fragment) {

        fragment.setCaller(this);
        FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.setCustomAnimations(R.anim.activity_slide_in_right, R.anim.activity_slide_out_left, R.anim.activity_slide_out_right, R.anim.activity_slide_in_left);
        fragmentTransaction.replace(R.id.content_frame, fragment);
        fragmentTransaction.addToBackStack(fragment.getClass().getName());
        fragmentTransaction.commit();
    }
  

Проблема, с которой я сталкиваюсь, заключается в том, что если я удаляю вызов обработчика из метода onViewCreated, переход происходит идеально. Если я помещаю обработчик, например, так, он убивает анимацию и просто показывает фрагмент без какой-либо анимации.
Если я использую handler.postInFrontOfQueue, анимация работает, но требуется некоторое время, прежде чем войти. Это означает, что сначала он обрабатывает обработчик, а только затем выполняет анимацию и переходит к фрагменту.
У вас есть какие-нибудь идеи, как я могу предотвратить это? Я уже пробовал в независимом потоке, и это не работает.
Спасибо.

Ответ №1:

Я только что нашел решение. Я должен указать количество времени, необходимое для появления анимации, во 2-м параметре метода postDelayed.

В моем случае:

 getResources().getInteger(android.R.integer.config_mediumAnimTime)
  

Таким образом, он запускает обработчик только после завершения анимации.

Не совсем то, что я хотел, но это работает. Я бы предпочел, чтобы оба процесса выполнялись параллельно, чтобы по завершении анимации обработчик также выполнял свою работу.