OnActivityResult 在片段内部不起作用。我怎样才能在我的代码上解决这个问题?
OnActivityResult does not work inside fragment. How can I fix this on my code?
所以我正在编写这个应用程序,它需要从 phone 中选择一张个人资料图片,裁剪、压缩并将图片保存到内存中的自定义位置,并将压缩位图设置为预览在圆形图像视图中。所有这一切都在一个片段中。但是我的 onActivityResult 根本没有在片段中被调用。
这是我的代码:
ViewPagerAdapter.class
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0:
return new ConfigurationFragment1();
case 1:
return new ConfigurationFragment2();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
ConfigurationFragment2.class
public class ConfigurationFragment2 extends Fragment {
CircularImageView profilePicker;
EditText user1NameInput;
Uri profileImageURI;
Bitmap compressedImageFile;
Boolean profileImageSet = false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_configuration_2, container, false);
profilePicker = rootView.findViewById(R.id.configuration_profile_picker);
user1NameInput = rootView.findViewById(R.id.configuration_name_1);
profilePicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
else if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
else {
chooseProfilePicture();
}
}
});
return rootView;
}
public void chooseProfilePicture(){
CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity());
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
{
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if(resultCode == Activity.RESULT_OK)
{
assert result != null;
profileImageURI = result.getUri();
File thumbnailURI = new File(Objects.requireNonNull(profileImageURI.getPath()));
try
{
compressedImageFile = new Compressor(getActivity())
.setMaxHeight(500)
.setMaxWidth(500)
.setQuality(100)
.compressToBitmap(thumbnailURI);
}
catch (IOException e)
{
e.printStackTrace();
}
profilePicker.setImageBitmap(compressedImageFile);
String profilePictureFolder = "/com.testapp.app/";
String profilePictureUser1Name = "profilePicUser1.jpg";
String profilePictureUser1Path = Environment.getExternalStorageDirectory().toString() + profilePictureFolder + profilePictureUser1Name;
File imagePath = new File(profilePictureUser1Path);
FileOutputStream fos;
try {
if (!imagePath.exists()) {
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder);
wallpaperDirectory.mkdirs();
}
File file = new File(new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder), profilePictureUser1Name);
if (file.exists()) {
file.delete();
}
fos = new FileOutputStream(imagePath);
compressedImageFile.compress(Bitmap.CompressFormat.JPEG, 85, fos);
fos.flush();
fos.close();
profileImageSet = true;
} catch (FileNotFoundException e) {
Log.e("eRROR", e.getMessage(), e);
} catch (IOException e) {
e.printStackTrace();
}
}
else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
{
assert result != null;
Exception error = result.getError();
}
}
}
}
和MainActivity.class
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_configuration);
setTheme(R.style.AppThemeBlueStatusDarkText);
objectInstance();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setSwipeable(false);
viewPager.setCurrentItem(currentPage);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
onActivityResult 代码在正常 activity 中完美运行,但在此片段中则不然。我究竟该如何解决我的问题?谢谢!
firstly you need to add tag to fragment ConfigurationFragment2 when initilaize it the edit onActivityResult in your activity like this :
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_configuration);
setTheme(R.style.AppThemeBlueStatusDarkText);
objectInstance();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setSwipeable(false);
viewPager.setCurrentItem(currentPage);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment ConfigurationFragment2 = getSupportFragmentManager().findFragmentByTag("ConfigurationFragment2 Tag");
switch (requestCode) {
case CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE:
if (ConfigurationFragment2 != null)
ConfigurationFragment2.onActivityResult(requestCode, resultCode, data);
break;
}
}
我认为问题出在这里:
public void chooseProfilePicture(){
CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity());
}
source code for this library 显示如下:
public void start(@NonNull Activity activity) {
mOptions.validate();
activity.startActivityForResult(getIntent(activity), CROP_IMAGE_ACTIVITY_REQUEST_CODE);
}
这意味着 start()
方法的 Activity
参数将用于启动 CropImage activity,因此将是接收结果的地方。相反,您应该使用库公开的其他 start()
方法:
public void start(@NonNull Context context, @NonNull Fragment fragment) {
fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE);
}
这意味着您将使用此代码:
public void chooseProfilePicture(){
CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity(), this);
}
现在结果应该传送到您的 Fragment。
所以我正在编写这个应用程序,它需要从 phone 中选择一张个人资料图片,裁剪、压缩并将图片保存到内存中的自定义位置,并将压缩位图设置为预览在圆形图像视图中。所有这一切都在一个片段中。但是我的 onActivityResult 根本没有在片段中被调用。
这是我的代码:
ViewPagerAdapter.class
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position)
{
case 0:
return new ConfigurationFragment1();
case 1:
return new ConfigurationFragment2();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
ConfigurationFragment2.class
public class ConfigurationFragment2 extends Fragment {
CircularImageView profilePicker;
EditText user1NameInput;
Uri profileImageURI;
Bitmap compressedImageFile;
Boolean profileImageSet = false;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_configuration_2, container, false);
profilePicker = rootView.findViewById(R.id.configuration_profile_picker);
user1NameInput = rootView.findViewById(R.id.configuration_name_1);
profilePicker.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
else if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(getActivity(), "Permission Denied", Toast.LENGTH_LONG).show();
ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
else {
chooseProfilePicture();
}
}
});
return rootView;
}
public void chooseProfilePicture(){
CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity());
}
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE)
{
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if(resultCode == Activity.RESULT_OK)
{
assert result != null;
profileImageURI = result.getUri();
File thumbnailURI = new File(Objects.requireNonNull(profileImageURI.getPath()));
try
{
compressedImageFile = new Compressor(getActivity())
.setMaxHeight(500)
.setMaxWidth(500)
.setQuality(100)
.compressToBitmap(thumbnailURI);
}
catch (IOException e)
{
e.printStackTrace();
}
profilePicker.setImageBitmap(compressedImageFile);
String profilePictureFolder = "/com.testapp.app/";
String profilePictureUser1Name = "profilePicUser1.jpg";
String profilePictureUser1Path = Environment.getExternalStorageDirectory().toString() + profilePictureFolder + profilePictureUser1Name;
File imagePath = new File(profilePictureUser1Path);
FileOutputStream fos;
try {
if (!imagePath.exists()) {
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder);
wallpaperDirectory.mkdirs();
}
File file = new File(new File(Environment.getExternalStorageDirectory().toString() + profilePictureFolder), profilePictureUser1Name);
if (file.exists()) {
file.delete();
}
fos = new FileOutputStream(imagePath);
compressedImageFile.compress(Bitmap.CompressFormat.JPEG, 85, fos);
fos.flush();
fos.close();
profileImageSet = true;
} catch (FileNotFoundException e) {
Log.e("eRROR", e.getMessage(), e);
} catch (IOException e) {
e.printStackTrace();
}
}
else if(resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE)
{
assert result != null;
Exception error = result.getError();
}
}
}
}
和MainActivity.class
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_configuration);
setTheme(R.style.AppThemeBlueStatusDarkText);
objectInstance();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setSwipeable(false);
viewPager.setCurrentItem(currentPage);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
onActivityResult 代码在正常 activity 中完美运行,但在此片段中则不然。我究竟该如何解决我的问题?谢谢!
firstly you need to add tag to fragment ConfigurationFragment2 when initilaize it the edit onActivityResult in your activity like this :
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_configuration);
setTheme(R.style.AppThemeBlueStatusDarkText);
objectInstance();
viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(viewPagerAdapter);
viewPager.setSwipeable(false);
viewPager.setCurrentItem(currentPage);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment ConfigurationFragment2 = getSupportFragmentManager().findFragmentByTag("ConfigurationFragment2 Tag");
switch (requestCode) {
case CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE:
if (ConfigurationFragment2 != null)
ConfigurationFragment2.onActivityResult(requestCode, resultCode, data);
break;
}
}
我认为问题出在这里:
public void chooseProfilePicture(){ CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity()); }
source code for this library 显示如下:
public void start(@NonNull Activity activity) { mOptions.validate(); activity.startActivityForResult(getIntent(activity), CROP_IMAGE_ACTIVITY_REQUEST_CODE); }
这意味着 start()
方法的 Activity
参数将用于启动 CropImage activity,因此将是接收结果的地方。相反,您应该使用库公开的其他 start()
方法:
public void start(@NonNull Context context, @NonNull Fragment fragment) { fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE); }
这意味着您将使用此代码:
public void chooseProfilePicture(){
CropImage.activity().setGuidelines(CropImageView.Guidelines.ON).setAspectRatio(1,1).start(getActivity(), this);
}
现在结果应该传送到您的 Fragment。