2

私のアプリには、4 つのタブを持つアクションバーをホストしている SherlockFragmentActivity があります。各タブは SherlockFragment です。タブの 1 つ (Tab1 としましょう) から通常のアクティビティを呼び出すと、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);
}

また、1 行目にスーパー コールを使用し、スーパー コールを使用せずに試してみました。

断片:

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

フラグメントの新しいインスタンスを作成しています。このインスタンスはアクティビティにアタッチされていないため、getActivity()はnullを返します。また、現在タブに表示されているフラグメントではありません。

フラグメントからアクティビティを開始するときは、Fragment#startActivityForResult(Bundle、int)を使用する必要があります。FragmentActivityは、適切なFragmentへのディスパッチを処理します。これを手動で行う必要はありません。

startActivityForResultを使用するときは、何かを行う前に、resultCodeがstartActivityForResultに渡したものと一致することを常に確認してください。

于 2012-09-09T13:13:31.037 に答える
0

Fragment.startActivityForResultあなたがそうした場合ではなく、 call を試してくださいFragment.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()コールバックを正確に受け取ることは問題ではないと思います。

私の推測では、null コンテキストをToast.makeText()呼び出しに渡すことになります

アクティビティからトーストを表示する場合は、次のようにします。

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

Toast フォームのフラグメントを表示する場合:

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

これを行う場合、渡す Context はToast.makeText()null であってはならず、この例外を回避できます。

于 2012-09-09T12:57:39.190 に答える