web-dev-qa-db-fra.com

onActivityResult n'appelle pas dans le fragment

La structure de l'application est la suivante:

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

1. Le code dans Activité :

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

2. Le code dans HomeFragment (Notez que HomeFragment n’est pas la fonction réelle mais un conteneur comme celui-ci, et il étend 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);
    }

}

3. 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. À la maison (contenu réel du fragment)  

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

5. Et dans le type de téléchargement, j'appelle l'activité caméra, mais onActivityResult n'est que de retour dans l'activité principale.  

startActivityForResult(intent, REQUEST_CAMERA);

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

Comment puis-je déclencher le onActivityResult sur UploadType? Merci pour l'aide.

9
user782104

La raison pour laquelle cela ne fonctionne pas est que vous appelez startActivityForResult() à partir d'un fragment imbriqué. Android est assez intelligent pour rediriger le résultat vers une Activity et même une Fragment, mais pas vers une Fragment imbriquée, ce qui explique pourquoi vous ne recevez pas le rappel . (Plus d'informations sur la raison pour laquelle cela ne fonctionne pas ici ou sur stackoverflow )

Maintenant, pour que cela fonctionne, je vous suggère d’acheminer manuellement le rappel à la ChildFragment (= UploadType) dans la 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);
}
29
Jeroen Mols

Dans mon cas, j'ai terminé en ajoutant le code suivant dans mon 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

Dans votre activité prioritaire onActivityForResult () comme ceci

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

Maintenant, dans votre fragment, vous pouvez obtenir le résultat de l'activité dans cette

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

Assurez-vous que, lorsque vous appelez, démarrez ActivityForResult dans votre fragment

startActivityForResult(intent, REQUEST_CAMERA);
8
goonerDroid

TabActivity-> ActivityA-> FragmentB, ce n'est pas du travail.

utiliser une mauvaise mauvaise mauvaise façon:

ActivitéA.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);
        }

    }
}
0
Dickson