【问题标题】:Why I'm not receiving any results from onActivityResult为什么我没有收到来自 onActivityResult 的任何结果
【发布时间】:2016-06-11 15:33:41
【问题描述】:

我通过在按下按钮时调用 showPickImageDialog() 方法从 AddFragment 开始 DialogFragment。在 AlertDialogFragment onActivityResult 我将结果发送回 AddFragmentAddFragment 没有收到任何结果。任何想法为什么?

添加片段:

    public class AddFragment extends Fragment {

    private static final int REQUEST_IMAGE = 3;
    private static final String DIALOG_IMAGE = "image";
    private static final String TAG = "TAG";

    void showPickImageDialog() {
        FragmentManager fm = getActivity()
                .getSupportFragmentManager();
        AlertDialogFragment pdialog = new AlertDialogFragment();
        pdialog.setTargetFragment(this, REQUEST_IMAGE);
        pdialog.show(fm, DIALOG_IMAGE);
    }



    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


            if (requestCode == REQUEST_IMAGE && resultCode == Activity.RESULT_OK){

                Log.e(TAG,"back in AddFragment");

            }
        }
}

在 AlertDialogFragment 中,我从 onActivityResult 方法调用 sendResult 方法。调用了 SendResult 方法我用 Logs 检查了它

AlertDialogFragment:

public class AlertDialogFragment extends DialogFragment {

private final static String TAG = "Cload";
public static final String EXTRA_PHOTOFILENAME =
        "com.example.tadas.dreamcload1.image";
private static final int REQUEST_IMAGE = 3;
private String filename;
private Uri uri;


private void sendResult(int resultCode) {
    if(getTargetFragment() == null){return;}

    Intent i = new Intent();
    i.putExtra(EXTRA_PHOTOFILENAME,filename);
   getTargetFragment()
           .onActivityResult(getTargetRequestCode(), resultCode, i);

}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    //LayoutInflater inflater = getLayoutInflater();
   // View dialogLaout = inflater.inflate(R.layout.custom_dialog_pick_image,null);
    LayoutInflater inflater = getActivity().getLayoutInflater();
    View view = inflater.inflate(R.layout.custom_dialog_pick_image, null);
    final AlertDialog dialog = new AlertDialog.Builder(getActivity())
            .setView(view)
            .create();
    ImageButton gallerybtn = (ImageButton)view.findViewById(R.id.gallery);
    ImageButton camerabtn = (ImageButton)view.findViewById(R.id.camera);

    gallerybtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e(TAG,"gallery btn pressed");
            Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                  startActivityForResult(intent, REQUEST_IMAGE);
        }
    });
    camerabtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });


    return dialog;
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == REQUEST_IMAGE && resultCode == Activity.RESULT_OK){

    uri = data.getData();

        final String[] filePathColumn = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DISPLAY_NAME};
        Cursor c = getActivity().getContentResolver()
                .query(uri,filePathColumn,null,null,null);

        if (c.moveToFirst()){
            int ids = c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            uri = Uri.parse(c.getString(ids));
            filename = uri.toString();
            c.close();
        }
        sendResult(Activity.RESULT_OK);
        dismiss();
    }

}

【问题讨论】:

    标签: java android android-fragments onactivityresult


    【解决方案1】:

    您可以在您的Activity 中覆盖您的onActivityResult 方法并手动调用您的片段的onActivityResult,如下所示:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.your_container);
        fragment.onActivityResult(requestCode, resultCode, data);
    }
    

    您可以在 Activity 的 onActivityResult 方法中定义这部分:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == REQUEST_IMAGE && resultCode == Activity.RESULT_OK){
    
        uri = data.getData();
    
            final String[] filePathColumn = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns.DISPLAY_NAME};
            Cursor c = getActivity().getContentResolver()
                    .query(uri,filePathColumn,null,null,null);
    
            if (c.moveToFirst()){
                int ids = c.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                uri = Uri.parse(c.getString(ids));
                filename = uri.toString();
                c.close();
            }
            // You do not need this any more
            //sendResult(Activity.RESULT_OK);
            //dismiss();
            // Just find your fragment and call it's onActivityResult
            Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.your_container);
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    
    }
    

    我认为这个改变会对你有所帮助。

    【讨论】:

    • 仍然没有返回结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 2021-09-05
    • 2016-01-13
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多