有一个 DialogFragment (SettingsBackImageDialog
) 通过点击 MainActivity 中的 Fragment (TrainerSettings
) 中的按钮打开。 SettingsBackImageDialog
中有一些按钮,其中一个用于拍照并在 Fragment 中将其设置为 Imageview (trainersettingsmainicon
)。
我通过以下方式在 TrainerSettings
中打开 SettingsBackImageDialog
:
public void onViewCreated (View view, Bundle savedInstanceState) {
view.findViewById(R.id.trainersettingsbackgroundbtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showEditbackImageDialog();
}
});
}
private void showEditbackImageDialog() {
android.support.v4.app.FragmentManager fm = getActivity().getSupportFragmentManager();
SettingsBackImageDialog settingsBackImageDialog = SettingsBackImageDialog.newInstance("Wybierz pierwszy kolor");
settingsBackImageDialog.show(fm, "SettingsBackImageDialog");
}
我在 SettingsBackImageDialog
中的代码是:
public class SettingsBackImageDialog extends DialogFragment {
int REQUESTCODE=1;
public SettingsBackImageDialog() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.settingsbackgroundimgdialog, container);
}
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.takephotobtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, REQUESTCODE);
}
});
String title = getArguments().getString("txt", "txt");
getDialog().setTitle(title);
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Toast.makeText(getActivity(), "before", Toast.LENGTH_LONG).show();
if(requestCode==REQUESTCODE & resultCode== Activity.RESULT_OK){
Bundle bundle = new Bundle();
bundle = data.getExtras();
Bitmap bitmap = (Bitmap)bundle.get("data");
ImageView img = (ImageView) getActivity().findViewById(R.id.trainersettingsmainicon);
img.setImageBitmap(bitmap);
Toast.makeText(getActivity(), "in", Toast.LENGTH_LONG).show();
}
}
}
在 MainActivity
中:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.MainContainer);
fragment.onActivityResult(requestCode, resultCode, data);
Toast.makeText(getApplicationContext(), "im here", LENGTH_SHORT).show();
}
应用程序打开相机,我可以拍摄照片并“接受”它,但没有其他任何事情发生。可能应用程序从不使用 onActivityResult 方法(我尝试在这个方法中写一些消息但没有发生)。
在 AndroidMonitor 中:
05-09 02:43:50.299 9709-10068/com.hgyghyfghyu.apkana40 W/GooglePlayServicesUtil: Google Play services out of date. Requires 8115000 but found 5089070
05-09 02:43:50.339 9709-9709/com.hgyghyfghyu.apkana40 W/EGL_emulation: eglSurfaceAttrib not implemented
我使用 nox app 来模拟安卓手机。
我应该怎么做才能解决我的问题?
最佳答案
选择的答案here准确解决您的问题。您还需要检查 this answer它解决了应该在何处处理 onActivityResult
的问题。
我的建议是按如下方式更改代码:
@Override
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.findViewById(R.id.takephotobtn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//changed getActivity().startActivityForResult(i, REQUESTCODE); to:
startActivityForResult(i, REQUESTCODE);
}
});
String title = getArguments().getString("txt", "txt");
getDialog().setTitle(title);
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}
onActivityResult()
将首先在 Activity
上调用。之后,如果您在 Activity 中调用 super.onActivityResult()
,它将到达 Fragments
。因此,您需要在 Activity
中添加 onActivityResult
回调 - 以便可以调用 Fragment
中的回调。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
完成后, fragment 上的 onActivityResult
将被调用,您的代码将按预期执行。
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==REQUESTCODE & resultCode== Activity.RESULT_OK){
Bundle bundle = new Bundle();
bundle = data.getExtras();
Bitmap bitmap = (Bitmap)bundle.get("data");
ImageView img = (ImageView) getActivity().findViewById(R.id.trainersettingsmainicon);
img.setImageBitmap(bitmap);
}
}
你需要看这两个密切相关的
关于java - Android onActivityResult 在对话框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37103612/