无法从片段中的 onActivityResult 控制进度条可见性
Cannot control Progressbar visibility from onActivityResult in Fragment
我有一个包含进度条的片段。我在 onCreateView()
方法中检索它,其中 setVisibility()
工作正常。
现在,当我尝试在 onActivityResult()
内设置同一进度条(在 class 级别的片段中声明)的可见性时,没有任何反应。这是代码。
@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);
}
}
}
}
}
我尝试在 Handler 中调用 setVisibility()
,也在 UI 线程上使用 runOnUiThread()
。这两种方法都不起作用。
如何控制 Fragment onActivityResult()
中进度条的可见性?
我需要它,因为我正在 onActivityResult()
中上传文件并且需要显示进度。
我认为您的 onActivityResult 未触发,因为它在片段中。请在包含片段的 activity 中使用以下代码。
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);
}
}
放这个
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");
}
}
在 onActivityResult() 之后调用了片段 onCreate()。因此,视图正在重新初始化并且未显示进度条。
创建了一个静态变量isVideoUploading。在 onActivityResult() 中适当地设置它的值,并在 onCreate() 中将其用于 show/hide 进度条。
这解决了一半的问题。上传开始时进度条现在可见。
问题的后半部分是在 firebase 异步上传方法完成时隐藏进度条。问题在于,由于上传是在后台线程中完成的,该线程在 onActivityResult() 中启动,因此 onCreateView() 无法在上传完成后再次触发。
为此,我在上传完成后使用 LocalBroadcastManager 发送了一个广播意图,并将其注册在同一个片段中。收到广播后,我隐藏了进度条。
我有一个包含进度条的片段。我在 onCreateView()
方法中检索它,其中 setVisibility()
工作正常。
现在,当我尝试在 onActivityResult()
内设置同一进度条(在 class 级别的片段中声明)的可见性时,没有任何反应。这是代码。
@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);
}
}
}
}
}
我尝试在 Handler 中调用 setVisibility()
,也在 UI 线程上使用 runOnUiThread()
。这两种方法都不起作用。
如何控制 Fragment onActivityResult()
中进度条的可见性?
我需要它,因为我正在 onActivityResult()
中上传文件并且需要显示进度。
我认为您的 onActivityResult 未触发,因为它在片段中。请在包含片段的 activity 中使用以下代码。
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);
}
}
放这个
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");
}
}
在 onActivityResult() 之后调用了片段 onCreate()。因此,视图正在重新初始化并且未显示进度条。
创建了一个静态变量isVideoUploading。在 onActivityResult() 中适当地设置它的值,并在 onCreate() 中将其用于 show/hide 进度条。 这解决了一半的问题。上传开始时进度条现在可见。
问题的后半部分是在 firebase 异步上传方法完成时隐藏进度条。问题在于,由于上传是在后台线程中完成的,该线程在 onActivityResult() 中启动,因此 onCreateView() 无法在上传完成后再次触发。 为此,我在上传完成后使用 LocalBroadcastManager 发送了一个广播意图,并将其注册在同一个片段中。收到广播后,我隐藏了进度条。