web-dev-qa-db-ja.com

onActivityResultはFragmentで呼び出されていません

このフラグメントをホストするアクティビティは、カメラアクティビティが戻ったときに呼び出されるonActivityResultを持ちます。

私の断片は、カメラに写真を撮るために送られた意図で結果のための活動を始めます。画像アプリケーションは正常にロードされ、写真を撮り、そして戻ります。しかしonActivityResultはヒットしません。ブレークポイントを設定しましたが、何もトリガーされません。フラグメントはonActivityResultを持つことができますか?それは提供されている機能なので、私はそう思うでしょう。なぜこれが引き起こされないのですか?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(Android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}
779
Spidy

ホスティングアクティビティはonActivityResult()をオーバーライドしますが、未処理の結果コードについてはsuper.onActivityResult()を呼び出しませんでした。明らかに、フラグメントがstartActivityForResult()呼び出しを行うものであっても、アクティビティは結果を処理する際に最初のショットを取得します。フラグメントのモジュール性を考えるとき、これは理にかなっています。未処理のすべての結果に対してsuper.onActivityResult()を実装すると、フラグメントは結果を処理することに弾みを付けました。

そしてまた@siqing答えから:

フラグメントの結果を取得するには、フラグメント内でstartActivityForResult(intent,111);ではなくgetActivity().startActivityForResult(intent,111);を呼び出すようにしてください。

1139
Spidy

私はあなたがgetActivity().startActivityForResult(intent,111);と呼んだと思います。あなたはstartActivityForResult(intent,111);を呼ぶべきです。

309
siqing

オプション1:

フラグメントからstartActivityForResult()を呼び出す場合は、フラグメントonActivityResult()になるので、startActivityForResult()ではなくgetActivity().startActivityForResult()を呼び出す必要があります。

startActivityForResult()のどこで呼び出しているのか、またどのようにしてメソッドを呼び出すのかわからない場合。

オプション2:

ActivityはonActivityResult()の結果を取得するので、アクティビティのonActivityResult()をオーバーライドし、super.onActivityResult()を呼び出して未処理の結果コードまたはすべてのフラグメントに伝播する必要があります。

上記の2つのオプションが機能しない場合は、オプション3を参照してください。

オプション3:

FragmentからonActivityResult関数への明示的な呼び出しは以下のとおりです。

親のActivityクラスで、onActivityResult()メソッドをオーバーライドし、さらにFragmentクラスで同じメソッドをオーバーライドして、次のコードとして呼び出します。

親クラスで:

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

子クラスで:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}
228
Vinayak

あなたのアクティビティの中のフラグメントがわからない場合は、それらすべてを列挙してアクティビティの結果引数を送るだけです。

// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}
76
ruX

私はChildFragmentManagerについても同じ問題を抱えています。マネージャはネストしたフラグメントに結果を渡さないでしょう、あなたはあなたのベースフラグメントでそれを手動でしなければなりません。

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}
74
MinceMan

元の投稿。

FragmentActivityrequestCodeを修正したものに置き換えます。その後、onActivityResult()が呼び出されると、FragmentActivityは上位16ビットを解析して元のフラグメントのインデックスを復元します。このスキームを見てください。

Enter image description here

ルートレベルにいくつかのフラグメントがある場合は問題ありません。しかし、 ネストしたフラグメント がある場合、例えばFragmentの中にいくつかのタブがあるViewPagerの場合、あなたは保証された問題に直面するでしょう(またはすでに直面している).

1つのインデックス のみがrequestCode内に格納されるためです。それはFragmentの中のFragmentManagerのインデックスです。入れ子になったフラグメントを使用しているとき、それ自身のフラグメントのリストを持つ子FragmentManagersがあります。そのため、ルートのFragmentManagerから始めて、インデックスのチェーン全体を保存する必要があります。

Enter image description here

どうすればこの問題を解決できますか? この投稿には 一般的な回避策があります

GitHub: https://github.com/shamanland/nested-fragment-issue

57
Oleksii K.

これは最も人気のある問題の1つです。この問題に関してはたくさんのスレッドがあります。しかし、それらのどれもMEに役立ちません。

だから私はこの解決策を使ってこの問題を解決しました。

最初にこれが起こっている理由を理解しましょう。

Fragmentから直接startActivityForResultを呼び出すことができますが、実際には後ろのメカニックはすべてActivityによって処理されます。

FragmentからstartActivityForResultを呼び出すと、requestCodeはFragmentのIDをコードに付加するように変更されます。それは、結果が受け取られたらこのリクエストを送った人をActivityが追跡できるようにします。

アクティビティが戻ってナビゲートされると、結果は変更されたrequestCodeと共にActivityのonActivityResultに送信され、元のrequestCode + FragmentのIDにデコードされます。その後、ActivityはonActivityResultを通じてActivity Resultをそのフラグメントに送信します。そしてそれはすべて完了です。

問題は:

Activityは、Activityに直接アタッチされているがネストされていないフラグメントのみに結果を送信できます。それが、入れ子になったフラグメントのonActivityResultが何に関係なく呼び出されることがなかった理由です。

解決策:

1)以下のコードであなたのフラグメントの中にIntentを始めてください:

       /** Pass your fragment reference **/
       frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2)親アクティビティで、今度は** onActivityResult():をオーバーライドします。

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

これを機能させるには、親アクティビティでこれを呼び出す必要があります。

3)あなたのフラグメント呼び出しで:

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

       }
}

それでおしまい。このソリューションでは、ネストされているかどうかにかかわらず、単一のフラグメントに適用できます。そしてはい、それはまたすべてのケースをカバーしています!また、コードも素敵できれいです。

40
KishuDroid

たくさんの入れ子になった断片のために(例えば、断片でViewPagerを使うとき)

あなたの主な活動の中で

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

あなたのフラグメントでは:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getChildFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

入れ子になったフラグメントの中

通話アクティビティ

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt - 別のフラグメントが答えを扱わないようにするために、入れ子になったフラグメントの中でユニークなintに置き換えてください。

応答を受け取る

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == uniqueInstanceInt ) {
        // TODO your code
    }
}

注意

「requestCodeには下位16ビットしか使用できない」というエラーを回避するために、uniqueInstanceIntに0から65536までの数値を使用する必要があります。

18

それでもできない場合は、2つのアドバイスを追加できます。 Manifest.xmlファイルで、コールバック時にホスティングアクティビティが終了しなかったこと、および開始されるアクティビティの起動モードが標準であることを確認します。下記の詳細を参照してください。

ホスティングアクティビティの場合は、no historyプロパティをfalseに設定します。

Android:noHistory="false"

アクティビティを開始するには、起動モードを標準として設定します。

Android:launchMode="standard"
13
jowett

私もこの問題にフラグメントで遭遇しました。そして私はstartActivityForResultの中でDialogFragmentを呼び出しました。

しかし、この問題は解決されました。
FragmentClassname.this.startActivityForResult

10
Courysky

このコードブロックを Fragment の外側から Utility Class にシフトし、parentActivity argument として渡した場合も、同じ問題に直面していました。

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);

それから、その Fragment onActivityResultメソッドで値を取得できませんでした。その後、 引数 Fragment に変更したので、methodの改訂された定義は次のようになりました。

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);

その後、 フラグメントのonActivityResultに値を入れることができました

解決策1:

startActivityForResult(intent, REQUEST_CODE);の代わりにgetActivity().startActivityForResult(intent, REQUEST_CODE);を呼び出します。

解決策2:

startActivityForResult(intent, REQUEST_CODE);が呼び出されると、アクティビティのonActivityResult(requestCode,resultcode,intent)が呼び出され、次にrequestCode, resultCode and intentを渡してここからfragments onActivityResult()を呼び出すことができます。

6
Amey Haldankar

入れ子になったフラグメント用(たとえば、ViewPagerを使用しているとき)

あなたの主な活動では:

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

メインのトップレベルのフラグメント(ViewPagerのフラグメント)では、次のようになります。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

YourFragment(入れ子になったフラグメント)の場合:

public void yourMethod(Intent data){
    // Do whatever you want with your data
}
5
Jyotman Singh

あなたのフラグメントの中で、電話してください

this.startActivityForResult(intent, REQUEST_CODE);

ここでthisはフラグメントを参照しています。そうでなければ@Clevesterが言ったようにする:

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

私も電話しなければならなかった

super.onActivityResult(requestCode, resultCode, data);

それを機能させるために親アクティビティのonActivityResultで。

(私は@ Clevesterの答えからこの答えを修正しました。)

5
Suragch

要するに、

フラグメントでは、Fragment fragment = thisを宣言します。

その後はfragment.startActivityForResultを使ってください。

結果はactivityResultに返されます。

5
Clevester

私の場合はAndroidのバグでした( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-Android/ )、サポートしているFragmentActivityを使用している場合getSupportFragmentManagerの代わりにgetChildFragmentManagerを使用するには、次のようにします。

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}
5
Hazlo8
public class takeimage extends Fragment {

    private Uri mImageCaptureUri;
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_FILE = 2;
    private String mPath;
    private ImageView mImageView;
    Bitmap bitmap = null;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_send_image, container, false);
        final String[] items = new String[] { "From Camera", "From SD Card" };
        mImageView = (ImageView)view.findViewById(R.id.iv_pic);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), Android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Image");

        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg");
                    mImageCaptureUri = Uri.fromFile(file);

                    try {
                        intent.putExtra(
                            Android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);
                        intent.putExtra("return-data", true);

                        getActivity().startActivityForResult(intent,
                            PICK_FROM_CAMERA);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    dialog.cancel();
                } else {
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    getActivity().startActivityForResult(
                        Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });
        final AlertDialog dialog = builder.create();

        Button show = (Button) view.findViewById(R.id.btn_choose);
        show.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

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

        if (resultCode != Activity.RESULT_OK)
            return;

        if (requestCode == PICK_FROM_FILE) {
            mImageCaptureUri = data.getData();
            // mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery

            if (mPath == null)
                mPath = mImageCaptureUri.getPath(); // from File Manager

            if (mPath != null)
                bitmap = BitmapFactory.decodeFile(mPath);
        } else {
            mPath = mImageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(mPath);
        }
        mImageView.setImageBitmap(bitmap);  
    }

    public String getRealPathFromURI(Uri contentUri) {
        String [] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null,null);

        if (cursor == null) return null;

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
} 
3
  1. フラグメントbaseActivity.startActivityForResultのBaseActivity onActivityResultをオーバーライドするだけです。

  2. BaseActivityでインターフェースを追加し、onActivityResultをオーバーライドします。

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
        getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
        setBaseActivityResult(null);
    }
    
  3. フラグメントでOnBaseActivityResultを実装しています

    @Override
    public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("RQ","OnBaseActivityResult");
    if (data != null) {
        Log.d("RQ","OnBaseActivityResult + Data");
        Bundle arguments = data.getExtras();
      }
    }
    

この回避策はうまくいくでしょう。

3
Khaled Lela

上記の問題が Facebookログイン に直面している場合は、次のコードをフラグメントの親アクティビティで使用できます。

Fragment fragment = getFragmentManager().findFragmentById(Android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

または:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

そしてあなたのフラグメントに以下の呼び出しを追加してください...

callbackManager.onActivityResult(requestCode, resultCode, data);
3
Ketan Patel

これらの答えのほとんどは、あなたがあなたのActivityのためにあなたのHost Fragmentsuper.onActivityResult(...)を呼ばなければならないと言い続けています。しかし、それは私のために働いていないようでした。

だから、あなたのホストではActivityあなたは代わりにあなたのFragmentsonActivityResult(...)と呼ぶべきです。これが一例です。

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

あなたのHostActivityのある時点で、あなたはthis.myFragmentをあなたが使っているFragmentに割り当てる必要があるでしょう。あるいは、FragmentManagerに参照を保持する代わりに、Fragmentを使用してHostActivityを取得します。また、this.myFragment.onActivityResult(...);を呼び出そうとする前にnullを確認してください。

3
prolink007

私の問題は、セットAndroid:launchMode="standard"で見つけたホストアクティビティにありました。一時的に削除して動作しました。

1
Chulo

あなたのコードは入れ子になったフラグメントを持っています。 super.onActivityForResultを呼び出しても動作しません

フラグメントを呼び出すことができるすべてのアクティビティを変更したり、フラグメントチェーン内のすべてのフラグメントを呼び出して回避したりする必要はありません。

これは多くの実用的な解決策のうちの1つです。オンザフライでフラグメントを作成し、サポートフラグメントマネージャを使用してアクティビティに直接配線します。次に、新しく作成したフラグメントからstartActivityForResultを呼び出します。

private void get_UserEmail() {

    if (view == null) {
        return;
    }
    ((TextView) view.findViewById(R.id.tvApplicationUserName))
            .setText("Searching device for user accounts...");

    final FragmentManager fragManager = getActivity().getSupportFragmentManager();

    Fragment f = new Fragment() {
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode,
                                     Intent data) {
            if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
                String mEmail = "";
                if (resultCode == Activity.RESULT_OK) {
                    if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
                        mEmail = data
                                .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    }
                }
                if (mActivity != null) {
                    GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
                }
                doUser();
            }
            super.onActivityResult(requestCode, resultCode, data);
            fragManager.beginTransaction().remove(this).commit();
        }
    };
    FragmentTransaction fragmentTransaction = fragManager
            .beginTransaction();
    fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
    fragmentTransaction.commit();
}
1
danny117

私は、ここでの答えはすべてハックにすぎないと強く疑っています。私はそれらをすべてそして他の多くを試みたが、ある種のばかな問題がいつもあるので信頼できる結論なしで。矛盾する結果に頼ることはできません。 Fragmentsの公式Android APIドキュメントを見ると、Googleには次のように明記されています。

フラグメントを含むActivityからstartActivityForResult(Intent、int)を呼び出します。

参照項目: Android Fragment API

したがって、最も正確で信頼性の高い方法は、実際にホスティングアクティビティから startActivityForResult() を呼び出し、そこから結果として得られる onActivityResult() を処理することです。

1
Chris

Ollie Cが言及したように、ネストされたフラグメントを使用しているときにonActivityResultへの戻り値を使用するサポートライブラリには活発なバグがあります。私はちょうどそれを打った: - (。

を参照してください。requestCode!= 0の場合、Fragment.onActivityResultは呼び出されません。

1
chaqke

私はただ回避方法を作ります:

public static Fragment _tempFragment = null;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(_tempFragment != null)
        _tempFragment.onActivityResult(requestCode, resultCode, data);
}

あなたのフラグメントの中で、startActivityResultの前に、

MainActivity._tempFragment = this;

OnActivityResult < - の後にフラグメント

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

     // Do your job
     {

     }
     MainActivity._tempFragment = null;
}
0
Ah Lam

他の回答でまだ説明されていない別のユースケース:

onActivityResult()を使用すると、フラグメントで宣言されたexception.startResolutionForResult()は呼び出されません。

if (exception is ResolvableApiException) {
    exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)
}

この場合、exception.startResolutionForResult()をフラグメントのstartIntentSenderForResult()に置き換えます。

if (exception is ResolvableApiException) {
    startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}
0
dominik

ネストしたフラグメントを使用している場合、これも機能します。

getParentFragment().startActivityForResult(intent, RequestCode);

これに加えて、親アクティビティからsuper.onActivityResultを呼び出して、フラグメントのonActivityResultメソッドを埋める必要があります。

0
Oguz Ozcan

フラグメントには以下のコードを使用してください。

@Override
public void onOtherButtonClick(ActionSheet actionSheet, int index) {

    if (index == 1)
    {
        Intent intent = new Intent(Intent.ACTION_PICK,
                                   Android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setType("image/*");
        startActivityForResult(Intent.createChooser(intent,
                                                    "Select Picture"), 1);
     }
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == 1) {
        if (requestCode == 1) {
            Uri selectedImageUri = data.getData();
            //selectedImagePath = getPath(selectedImageUri);
        }
    }
}

onActivityResultは、その親を呼び出さずに呼び出します。

0
Kirtikumar A.

最も簡単な方法の1つは、あなたのフラグメントからアクティビティを開始することです。

startActivity(ActivityName);

次に、あなたのアクティビティからstartActivityForResult(intent,"1");を呼び出し、アクティビティにonActivityResultを追加します。

startActivityForResult(intent,"1");

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
// perform other activity result like fetching from Uris or handling cursors

finish(); // finish the activity will  get to back to your fragment.
}
0
Rohit Goyal

Kotlinバージョン(アクティビティonActivityResult())

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //add following lines in your activity
    if(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)
     for (i in 0..supportFragmentManager?.fragments!!.size-1) {
         val fragment= supportFragmentManager?.fragments!!.get(i)
         fragment.onActivityResult(requestCode, resultCode, data)
    }
 }
0
Ranjith Kumar

ホストアクティビティ 起動モード mentionまたはsingleInstanceに設定しないようにするためのsingleTaskを持っている人はいません。

起動モードがSingleInstanceまたはSingleTaskに設定されている場合、onActivityResultは機能しません。またはあなたはこれらのIntentFiltersを使ってあなたの活動を呼びます

standardまたはsingleTop起動モードは問題なく動作します。

0
Xar E Ahmer

フラグメントクラス内にあるメソッドonActivityResultに問題があり、フラグメントクラス内にあるものも更新したい場合は、次のようにします。

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

    if(resultCode == Activity.RESULT_OK)
    {
        // If the user had agreed to enabling Bluetooth,
        // populate the ListView with all the paired devices.
        this.arrayDevice = new ArrayAdapter<String>(this.getContext(), R.layout.device_item);
        for(BluetoothDevice bd : this.btService.btAdapater.getBondedDevices())
        {
            this.arrayDevice.add(bd.getAddress());
            this.btDeviceList.setAdapter(this.arrayDevice);
        }
    }
    super.onActivityResult(requestCode, resultCode, data);
}

上記のコードに示すようにthis.variableを追加するだけです。それ以外の場合、メソッドは親アクティビティ内で呼び出され、変数は現在のインスタンスを更新しません。

また、このコードブロックをMainActivityに入れ、thisHomeFragmentクラスに置き換え、変数を静的にしてテストしました。期待通りの結果が得られました。

ですから、フラグメントクラスに独自のonActivityResultの実装を持たせたい場合は、上記のコード例が答えになります。

0

私はFragmentを拡張する基本クラスを書くことによって問題を処理しました、そして活動のonactivityresultで私はfragmenttagを使って現在走っているフラグメントを識別しました。それから私はfragmentbaseクラスのユーザー定義メソッドを呼び出します。これは現在実行中のフラグメントのイベントを起動します。

0
Bytecode