web-dev-qa-db-ja.com

onActivityResultがフラグメントで呼び出されない

アプリの構造は次のとおりです。

tabHost (in Activity) -> contains -> TabFragment(extend base container fragment)

1。アクティビティのコード

tabHost.addTab(
                tabHost.newTabSpec("home").setIndicator("",
                        getResources().getDrawable(R.drawable.btn_home)),
                HomeFragment.class, null);

2。HomeFragmentのコード(HomeFragmentは実際の関数ではなく、このようなコンテナーであり、BaseContainerFragmentを拡張することに注意してください):

public class HomeFragment extends BaseContainerFragment {

    public Home homeFrag;
    private boolean mIsViewInited;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.container_fragment, null);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (!mIsViewInited) {
            mIsViewInited = true;
            initView();
        }
    }

    private void initView() {
        homeFrag = new Home();
        replaceFragment(homeFrag, false);
    }

}

。BaseContainerFragment

public class BaseContainerFragment extends Fragment {

    public void replaceFragment(Fragment fragment, boolean addToBackStack) {
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        if (addToBackStack) {
            transaction.addToBackStack(null);
        }
        transaction.replace(R.id.container_framelayout, fragment);
        transaction.commit();
    }

    public boolean popFragment() {
        boolean isPop = false;
        if (getChildFragmentManager().getBackStackEntryCount() > 0) {
            isPop = true;
            getChildFragmentManager().popBackStack();
        }
        return isPop;
    }

}

4。ホーム(フラグメントの実際のコンテンツ)

UploadType fragment = new UploadType();
                    Bundle bundle = new Bundle();
                    bundle.putString("form_type", "request");
                    fragment.setArguments(bundle);
                    ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true);

5。UploadTypeでは、カメラアクティビティを呼び出しますが、onActivityResultはメインアクティビティでのみ返されます。

startActivityForResult(intent, REQUEST_CAMERA);

public void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d("test1", "result2");
        super.onActivityResult(requestCode, resultCode, data);
}

UploadTypeでonActivityResultをトリガーするにはどうすればよいですか?手伝ってくれてありがとう。

10
user782104

これが機能しない理由は、ネストされたフラグメント内からstartActivityForResult()を呼び出しているためです。 Androidは、結果をActivityおよびFragmentにルーティングするのに十分スマートですが、ネストされたFragmentにはルーティングしないため、なぜコールバックを取得しません(それが機能しない理由の詳細 here または stackoverflow ))

これを機能させるために、コールバックをChildFragment(= UploadType)のParentFragment(= BaseContainerFragment)に手動でルーティングすることをお勧めします。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment uploadType = getChildFragmentManager().findFragmentById(R.id.container_framelayout);

    if (uploadType != null) {
        uploadType.onActivityResult(requestCode, resultCode, data);
    }
    super.onActivityResult(requestCode, resultCode, data);
}
31
Jeroen Mols

私の場合、次のコードをMainActivity.Java

@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);
    }
}
13
Kasim Rangwala

このようにあなたの活動オーバーライドでonActivityForResult()

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

今、あなたのフラグメントで、あなたはこれの中に活動結果を得ることができます

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      Log.d("test1", "result2");
    }

フラグメントでstart ActivityForResultを呼び出すときは、次のようにしてください。

startActivityForResult(intent, REQUEST_CAMERA);
9
goonerDroid

ナビゲーションアーキテクチャコンポーネントのNavHostFragmentの場合

単一のアクティビティを使用していて、NavHostFragment内にフラグメントがある場合、NavHostFragmentの子フラグメントのonActivityResult()が呼び出されないという問題があります。

この問題を修正するには、ホストアクティビティのonActivityResult()内から子フラグメントのonActivityResult()を手動で呼び出す必要があります。ホストアクティビティは、NavHostFragmentをホストするアクティビティです。

以下は、ホストアクティビティのonActivityResult()のKotlinコードです。

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.your_nav_Host_fragment)
    val childFragments = navHostFragment?.childFragmentManager?.fragments
    childFragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
}
0

TabActivity-> ActivityA-> FragmentB、それは動作しません。

悪い悪い悪い方法を使う:

ActivityA.Java

public void onSelectSomething(){

    ...

    startActivityForResult(intent, 22222);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (mFragment != null) {
        mFragment.onActivityResult(requestCode, resultCode, data);
    }
}

FragmentB.Java

if(getActivity() instanceof ActivityA) {
    ((RepairerListActivity)getActivity()).onSelectSomething();
} 


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 22222) {
        // do things
    }
}   
0
qinmiao
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // Loop through all child fragments of the activity
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {

        // check if the current fragment is YourFragment
        if (fragment instanceof YourFragment ) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }

    }
}