2

在我的应用程序中,我有一个 SherlockFragmentActivity,它托管一个带有 4 个选项卡的操作栏。每个选项卡都是一个 SherlockFragment。从其中一个选项卡(比如说 Tab1)调用普通 Activity 与 startActivityForResult(myIntent1, 0) 一起工作正常;

但是我在 Tab1 中的 onActivityResult 永远不会被调用。在阅读了很多主题后,我了解到我的主要活动的 onActivityResult 是首先被调用的,这确实是。但是我无法将值传递给我的片段的 onActivityResult。

这是我的代码...

主要活动:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment mFragment = Fragment.instantiate(this, Tab1.class.getName());
    mFragment.onActivityResult(requestCode, resultCode, data);
    super.onActivityResult(requestCode, resultCode, data);
}

还尝试在第一行使用超级呼叫而没有超级呼叫。

分段:

public void onActivityResult(int requestCode, int resultCode, Intent data){
    //super.onActivityResult(requestCode, resultCode, data);
    Toast.makeText(context, String.valueOf(requestCode), Toast.LENGTH_SHORT).show();

    if(requestCode == 0) {
        if(resultCode == Activity.RESULT_OK) {
            //do some stuff here
        }
    }
}

还尝试在开始和结束时使用超级呼叫。

每次我得到同样的错误:

09-09 14:33:34.230: E/AndroidRuntime(7408): FATAL EXCEPTION: main
09-09 14:33:34.230: E/AndroidRuntime(7408): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65536, result=-1, data=null} to activity {com.BlubBlub.TimeMate/com.BlubBlub.TimeMate.TimeMateActivity}: java.lang.NullPointerException
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3267)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3310)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.ActivityThread.access$1100(ActivityThread.java:142)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.os.Looper.loop(Looper.java:137)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.ActivityThread.main(ActivityThread.java:4930)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at java.lang.reflect.Method.invokeNative(Native Method)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at java.lang.reflect.Method.invoke(Method.java:511)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at dalvik.system.NativeStart.main(Native Method)
09-09 14:33:34.230: E/AndroidRuntime(7408): Caused by: java.lang.NullPointerException
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.widget.Toast.<init>(Toast.java:92)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.widget.Toast.makeText(Toast.java:238)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at com.BlubBlub.TimeMate.Tab1.onActivityResult(Tab1.java:125)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at com.BlubBlub.TimeMate.TimeMateActivity.onActivityResult(TimeMateActivity.java:150)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.Activity.dispatchActivityResult(Activity.java:5192)
09-09 14:33:34.230: E/AndroidRuntime(7408):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3263)

什么是让它工作的正确方法?我现在真的很绝望……

4

3 回答 3

3

您正在创建片段的新实例。此实例未附加到 Activity,因此 getActivity() 返回 null。它也不是当前显示在您的选项卡中的片段。

从 Fragment 启动 Activity 时,您必须使用Fragment#startActivityForResult(Bundle, int)。然后 FragmentActivity 将为您处理将其分派到正确的 Fragment。您不必手动执行此操作。

使用 startActivityForResult 时,请确保在执行任何操作之前始终检查 resultCode 是否与您传递给 startActivityForResult 的代码相匹配。

于 2012-09-09T13:13:31.037 回答
0

试试 call Fragment.startActivityForResultFragment.getActivity().startActivityForResult如果你这样做了。请参阅 android 源代码并注意尊重。

//Fragment.java
////////////////
/**
 * Call {@link Activity#startActivityForResult(Intent, int)} on the fragment's
 * containing Activity.
 */
public void startActivityForResult(Intent intent, int requestCode) {
    if (mActivity == null) {
        throw new IllegalStateException("Fragment " + this + " not attached to Activity");
    }
    mActivity.startActivityFromFragment(this, intent, requestCode);
}

// FragmentActivity.java
////////////////////////
/**
 * Called by Fragment.startActivityForResult() to implement its behavior.
 */
public void startActivityFromFragment(Fragment fragment, Intent intent, 
        int requestCode) {
    if (requestCode == -1) {
        super.startActivityForResult(intent, -1);
        return;
    }
    if ((requestCode&0xffff0000) != 0) {
        throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
    }
    super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff));
}
于 2013-05-29T14:13:20.827 回答
0

您的堆栈跟踪表明您在 Toast 类中有 NullPointerException,所以我认为准确接收onActivityResult()回调不是问题。

我的猜测是您将空上下文传递给Toast.makeText()调用

如果您从 Activity 中显示 Toast,请执行以下操作:

Toast.makeText(this, "Message", Toast.LENGTH_SHORT).show();

如果您显示 Toast 是一个片段:

Toast.makeText(getActivity(), "Message", Toast.LENGTH_SHORT).show();

如果这样做,则传递给的 ContextToast.makeText()不应为 null,并且您将避免此异常。

于 2012-09-09T12:57:39.190 回答