java - Android onActivityResult 在对话框中

标签 java android android-fragments android-studio

有一个 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/

相关文章:

java - 将字符串变量的值分配给另一个字符串变量

Java 2D : Why won't my JPanel let me resize it?

java - weka 中的 SMO 置信度度量

java - 如何访问类的目的实例并传递数据?

android - 在 Listview 中使用 ViewPager 时不会调用 OnItemClickListener

android - Google Play 服务 6.5.87 与 7.3.0 - 布局问题?

java - 是否可以通过使用 JNI 来避免 jvm 安全性?

android - 如何将json对象转换为class对象

java - openFileOutput() 方法与 FileOutputStream() 构造函数

android - 在 Android Fragment 中膨胀布局