【问题标题】:Fragment onActivityResult method on executing calls activity onActivityResult片段 onActivityResult 方法执行调用活动 onActivityResult
【发布时间】:2013-05-02 07:49:15
【问题描述】:

在我的片段中,我已经启动了用于照片捕获的 startActivityforresult 意图。我已经覆盖了片段类中的 onActivityResult 回调方法。我已经在主要活动中为其他一些意图实现了 onActivityResult 回调。我的问题是执行调用活动 onActivityResult 方法并返回空指针异常后的片段 onActivityResult。 分片onactivityresult方法

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK) 
    {
        prof_bitmap = null;
        if (requestCode == 0) 
        {
            Log.e("" ,"entered activity Result Code 0");
            Uri photoUri = data.getData();
            if (photoUri != null) 
            {
                String[] filePathColumn = { MediaStore.Images.Media.DATA };
                Cursor cursor = getActivity().getContentResolver().query(
                        photoUri, filePathColumn, null, null, null);
                cursor.moveToFirst();
                int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                String filePath = cursor.getString(columnIndex);
                cursor.close();
                Log.e("" ,"File Path" +filePath);
                prof_bitmap = setImage(filePath);
            }
        }
        if (requestCode == 1) 
        {
            Log.e("" ,"entered activity Result Code 1");
            Bitmap bitmap = (Bitmap) data.getExtras().get("data"); 
            prof_bitmap = bitmap;
            Log.e("" ,"entered activity Result Code 1"+bitmap);
            profile_pic.setImageBitmap(bitmap);
        }
    }
}

Activity onActivityResult

  @Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    Log.e("" ,"called onActivityResult in main");
    Session.getActiveSession().onActivityResult(this, requestCode,
            resultCode, data);
}

如何只调用fragment onactivityresult方法?

我的日志猫

传递结果失败 ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data dat=content://media/external/images/media/222 (有附加) } } 到活动 {com.mobiotics.tvbuddydemo/com.mobiotics.tvbuddydemo.TVBuddyMainActivity}:java.lang.NullPointerException

【问题讨论】:

标签: android android-intent android-fragments


【解决方案1】:

如果你的Activity中定义了onActivityResult,你不能跳过它直接进入Fragment。但是,如果 Activity 不知道如何处理它,您可以将其重定向到 Fragment。使用唯一的 requestCodes 来区分谁处理结果。

public void onActivityResult(int requestCode, int resultCode, Intent data) 
{
    boolean processed = true;

    if (resultCode == Activity.RESULT_OK) 
    {
        if (requestCode == 0) {
            // Something
        } else if (requestCode == 1) {
            // Something
        } else {
            processed = false;
        }
    } else { // Error
        if (requestCode == 0) {
            // Handle error 
        } else {
            processed = false;
        }
    }

    if (!processed) {
        fragment1.onActivityResult(requestCode, resultCode, data);
        fragment2.onActivityResult(requestCode, resultCode, data);
        ...
        super.onActivityResult(requestCode, resultCode, data);
    }
}

注意:确保从片段中调用 getActivity().startActivityForResult() 而不是简单地使用 this.startActivityForResult()

public void something(Intent intent) {
    getActivity().startActivityForResult(intent);
    // or if you are using SherlockActionBar/Support package
    getSupportActivity().startActivityForResult(intent);
}

希望这会有所帮助。

【讨论】:

  • 这意味着您从 Fragment 错误地调用 startActivityForResult() 。您需要调用 getActivity().startActivityForResult()。我将更新答案以包含此内容。
  • 我已经实现了上述但在传递结果信息错误空指针异常时失败
  • 请检查上面的 logcat
  • 为什么我在根活动之前调用了片段的onActivityResult
【解决方案2】:

尝试删除片段onActivityResult() 中的super.onActivityResult(requestCode, resultCode, data); 行。

【讨论】:

  • 如果退出/关闭activity,必须调用activity方法onActivityResult()。我建议您删除片段方法并仅按活动使用onActivityResult()
【解决方案3】:

当您以startActivityForResult 开始的Activity 完成调用finish() 时,将调用public void onActivityResult

【讨论】:

    【解决方案4】:

    Activity 中的 onActivityResult 将被首先调用,你不应该删除 Activity 中的结果处理,而是通过检查 requestCode 来做你想做的事情。

    【讨论】:

      【解决方案5】:

      我也面临这个问题。

      从片段调用活动

      ((Activity)context).startActivityForResult(photoPickerIntent, 100);

      这里是来自 FragmentActivity 的“上下文”。现在结果来自 FargmentActivity onActivityResult 方法。要切换此结果,您必须在 fragmetn 活动类中声明片段类的静态变量。

      static ActivityUploadPhotos activityUploadPhotos;
      
      ...
      ActivityUploadPhotos f = new ActivityUploadPhotos();
      ActivityHome.activityUploadPhotos=f;
      ......
      
      if(activityUploadPhotos!=null)
      {
                 activityUploadPhotos.onActivityResult(requestCode, resultCode, data);
      }
      

      【讨论】:

        猜你喜欢
        • 2022-10-02
        • 2011-09-03
        • 2019-12-05
        相关资源
        最近更新 更多