Android activityResult上的片段返回null

Android activityResult上的片段返回null,android,android-fragments,Android,Android Fragments,在我正在开发的应用程序中,用户可以在其个人资料中定义图像。第一次执行应用程序时,会显示一个介绍活动,用户可以选择从galery中选择一张照片或使用相机拍摄一张新照片 这个很好用。在用户设置了一张个人资料图片后,我将其保存在应用程序文件夹中,以后我可以在应用程序中使用该图片 我的应用程序基于导航抽屉(支持),因此它由片段组成。其中一个片段用于显示配置文件pic的用户配置文件。在此,用户有机会再次更改此图片。这就是我遇到麻烦的地方 要选择一个新的pic,我使用的代码与在intro活动中获取pic时使

在我正在开发的应用程序中,用户可以在其个人资料中定义图像。第一次执行应用程序时,会显示一个介绍活动,用户可以选择从galery中选择一张照片或使用相机拍摄一张新照片

这个很好用。在用户设置了一张个人资料图片后,我将其保存在应用程序文件夹中,以后我可以在应用程序中使用该图片

我的应用程序基于导航抽屉(支持),因此它由片段组成。其中一个片段用于显示配置文件pic的用户配置文件。在此,用户有机会再次更改此图片。这就是我遇到麻烦的地方

要选择一个新的pic,我使用的代码与在intro活动中获取pic时使用的代码相同,只是根据片段调整了一些内容(放置getActivity()。但它似乎并没有将图像返回到片段,而是抛出了一个NPE

这是如何在SettingsFragment中从gallery中选择pic的:

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
galleryIntent.setType("image/*");
startActivityForResult(galleryIntent, PICK_IMAGE_REQUEST_FRAG);
下面是设置片段时的onActivityResult:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case PICK_IMAGE_REQUEST_FRAG:
            if (resultCode == getActivity().RESULT_OK && data != null) {
                /*We get the image URI*/
                Uri selectedImageUri = data.getData();
                Bitmap srcBmp = null;
                try {
                    srcBmp = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImageUri);
                } catch (FileNotFoundException e) {
                    Log.e("GET_IMAGE", e.getMessage(), e);
                } catch (IOException e) {
                    Log.e("GET_IMAGE", e.getMessage(), e);
                }

                /*Transform the original image to landscape to use it as profile background*/
                Bitmap landBmp = null;
                if (srcBmp.getWidth() <= srcBmp.getHeight()) {
                    landBmp = Bitmap.createBitmap(
                            srcBmp,
                            0,
                            srcBmp.getHeight()/2 - srcBmp.getWidth()/2, //srcBmp.getHeight()/4 ?
                            srcBmp.getWidth(),
                            srcBmp.getWidth() /2
                    );
                }

                /*Scale the bitmap*/
                int originalWidth = srcBmp.getWidth();
                int originalHeight = srcBmp.getHeight();
                int newWidth = 400;
                int newHeight = (originalHeight*newWidth)/originalWidth;
                Bitmap fullbitmap = Bitmap.createScaledBitmap(landBmp, newWidth, newHeight, true);
                /*Save the bitmap in app-folder*/
                ContextWrapper cw1 = new ContextWrapper(getActivity().getApplicationContext());
                File directory1 = cw1.getDir("profile", Context.MODE_PRIVATE);
                if (!directory1.exists()) {
                    directory1.mkdir();
                }
                File filepath1 = new File(directory1, "profile_pic.png");
                FileOutputStream fos1 = null;
                try {
                    fos1 = new FileOutputStream(filepath1);
                    fullbitmap.compress(Bitmap.CompressFormat.PNG, 100, fos1);
                    fos1.close();
                } catch (Exception e) {
                    Log.e("SAVE_FULL_IMAGE", e.getMessage(), e);
                }

                /*Show background profile pic*/
                Drawable drawable = new BitmapDrawable(getResources(), fullbitmap);
                header_container.setBackgroundDrawable(drawable);
            }
            break;
其中第275行是
Bitmap fullbitmap=Bitmap.createscaledbimat(landBmp,newWidth,newHeight,true)


所以,我不太明白发生了什么,因为它说了一些无法将结果偏差到MainActivity的内容,它必须将结果传递到SettingsFragment。

您可以阅读:

创建ActivityResultEvent.java

import android.content.Intent;

/**
 * Created by nuuneoi on 3/12/2015.
 */
public class ActivityResultEvent {

    private int requestCode;
    private int resultCode;
    private Intent data;

    public ActivityResultEvent(int requestCode, int resultCode, Intent data) {
        this.requestCode = requestCode;
        this.resultCode = resultCode;
        this.data = data;
    }

    public int getRequestCode() {
        return requestCode;
    }

    public void setRequestCode(int requestCode) {
        this.requestCode = requestCode;
    }

    public int getResultCode() {
        return resultCode;
    }

    public void setResultCode(int resultCode) {
        this.resultCode = resultCode;
    }

    public Intent getData() {
        return data;
    }

    public void setData(Intent data) {
        this.data = data;
    }
}
创建ActivityResultBus.java

import android.os.Handler;
import android.os.Looper;

import com.squareup.otto.Bus;

/**
 * Created by nuuneoi on 3/12/2015.
 */
public class ActivityResultBus extends Bus {

    private static ActivityResultBus instance;

    public static ActivityResultBus getInstance() {
        if (instance == null)
            instance = new ActivityResultBus();
        return instance;
    }

    private Handler mHandler = new Handler(Looper.getMainLooper());

    public void postQueue(final Object obj) {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                ActivityResultBus.getInstance().post(obj);
            }
        });
    }

}
//>>>>>>>>覆盖活动上的活动结果

public class MainActivity extends ActionBarActivity {

    ...

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        ActivityResultBus.getInstance().postQueue(
                    new ActivityResultEvent(requestCode, resultCode, data));
    }

    ...

}
在片段中:

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Don't forget to check requestCode before continuing your job
        if (requestCode == 12345) {
            // Do your job
            tvResult.setText("Result Code = " + resultCode);
        }
    }
 @Override
    public void onStart() {
        super.onStart();
        ActivityResultBus.getInstance().register(mActivityResultSubscriber);
    }

    @Override
    public void onStop() {
        super.onStop();
        ActivityResultBus.getInstance().unregister(mActivityResultSubscriber);
    }

    private Object mActivityResultSubscriber = new Object() {
        @Subscribe
        public void onActivityResultReceived(ActivityResultEvent event) {
            int requestCode = event.getRequestCode();
            int resultCode = event.getResultCode();
            Intent data = event.getData();
            onActivityResult(requestCode, resultCode, data);
        }
    };

如果onActivityResult()的
onActivityResult()方法未完成并返回,系统将其视为传递失败,这就是错误以该消息开头的原因


在您的代码中,
landBmp
似乎为null,因为条件
srcBmp.getWidth()检查srcBmp变量是否为null。非常感谢Mike!我没意识到我还没处理好!这样的错误
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // Don't forget to check requestCode before continuing your job
        if (requestCode == 12345) {
            // Do your job
            tvResult.setText("Result Code = " + resultCode);
        }
    }
 @Override
    public void onStart() {
        super.onStart();
        ActivityResultBus.getInstance().register(mActivityResultSubscriber);
    }

    @Override
    public void onStop() {
        super.onStop();
        ActivityResultBus.getInstance().unregister(mActivityResultSubscriber);
    }

    private Object mActivityResultSubscriber = new Object() {
        @Subscribe
        public void onActivityResultReceived(ActivityResultEvent event) {
            int requestCode = event.getRequestCode();
            int resultCode = event.getResultCode();
            Intent data = event.getData();
            onActivityResult(requestCode, resultCode, data);
        }
    };