Невозможно управлять видимостью Progressbar из onActivityResult во фрагменте - PullRequest
0 голосов
/ 14 мая 2018

У меня есть фрагмент, который содержит индикатор прогресса. Я получаю его методом onCreateView(), где setVisibility() работает нормально.

Теперь, когда я пытаюсь установить видимость того же индикатора выполнения (объявленного во фрагменте на уровне класса) внутри onActivityResult(), ничего не происходит. Вот код

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
if(requestCode == REQUEST_CODE_PROFILE_VIDEO_PATH){
        if(resultCode == Activity.RESULT_OK) {
            String profileVideoPath = data.getExtras().getString(ProfileVideoRecordingActivity.VIDEO_PROFILE_PATH);
            Log.d("DEBUG", profileVideoPath);

            //Upload to server
            File profileVideo = new File(profileVideoPath);
            if(profileVideo.exists()) {

                pbarVideoUpload.setVisibility(View.VISIBLE);
                FireBaseWrapper fileUploader = new FireBaseWrapper();
                String serverFolderPath = "videoprofile";
                String contentType = "video/mp4";
                FireBaseAfterUpload afterUpload = new FireBaseAfterUpload() {
                    @Override
                    public void onSuccess(String uploadURL) {
                        Log.d("DEBUG", "Successfully uploaded video to server");
                        Log.d("DEBUG", uploadURL);
                        pbarVideoUpload.setVisibility(View.GONE);

                        ProfileService profileService = new ProfileService(TAG) {
                            @Override
                            protected void onPreServiceCall() {

                            }

                            @Override
                            protected void onPostServiceCall() {

                            }

                            @Override
                            public void afterSuccess(Object object) {
                                ReturnCode successCode = (ReturnCode) object;
                                if(successCode.getSuccess()){
                                    Log.d("DEBUG", "Profile Video URL updated in DB");
                                }else{
                                    Log.d("DEBUG", "Profile Video URL NOT updated in DB");
                                }
                            }

                            @Override
                            public void afterError() {
                                Log.d("DEBUG", "Profile Video URL NOT updated in DB");
                            }
                        };
                        profileService.updateVideoPath(uploadURL);

                    }

                    @Override
                    public void onProgress(String data) {

                    }

                    @Override
                    public void onFaliure() {
                        Log.d("DEBUG", "Error! Didn't upload");
                        pbarVideoUpload.setVisibility(View.GONE);
                    }
                };

                try {
                    fileUploader.upload(profileVideo, profileVideo.getName(), serverFolderPath, afterUpload, contentType, false);
                }catch (FileNotFoundException e){
                    Log.e("DEBUG", "FileNotFoundException", e);
                }
            }

        }
    }
}

Я пытался вызвать setVisibility() внутри обработчика, а также в потоке пользовательского интерфейса, используя runOnUiThread(). Оба подхода не сработали.

Как я могу контролировать видимость индикатора выполнения внутри onActivityResult() фрагмента?

Мне это нужно, так как я загружаю файл внутри onActivityResult() и должен отображать прогресс.

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

положить это

  pbarVideoUpload.setVisibility(View.GONE);

Внутри это также, как я уже говорил,

                            @Override
                            public void afterSuccess(Object object) {
                                ReturnCode successCode = (ReturnCode) object;
                                if(successCode.getSuccess()){
                                  pbarVideoUpload.setVisibility(View.GONE);
                                    Log.d("DEBUG", "Profile Video URL updated in DB");
                                }else{
                                    Log.d("DEBUG", "Profile Video URL NOT updated in DB");
                                }
                            }
0 голосов
/ 15 мая 2018

Фрагменты onCreate () вызывались после onActivityResult (). Следовательно, представления переинициализировались, и индикатор выполнения не отображался.

Создана статическая переменная isVideoUploading. Установите соответствующие значения в onActivityResult () и используйте его, чтобы показать / скрыть индикатор выполнения в onCreate (). Это решило половину проблемы. Индикатор выполнения теперь был виден при загрузке.

Вторая половина проблемы заключалась в том, чтобы скрыть индикатор выполнения при завершении асинхронной загрузки через firebase. Проблема заключалась в том, что, поскольку загрузка выполнялась в фоновом потоке, который начинался в onActivityResult (), у onCreateView () не было возможности запустить снова после завершения загрузки. Для этого я отправил широковещательный урок с использованием LocalBroadcastManager, когда загрузка была завершена, и зарегистрировал его в том же фрагменте. Как только трансляция была получена, я спрятал индикатор выполнения.

0 голосов
/ 14 мая 2018

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

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
Fragment fragment = (Fragment) getSupportFragmentManager().findFragmentByTag(fragmentTag);
if (fragment != null) {
    fragment.onActivityResult(requestCode, resultCode, intent);
}
}
...