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.
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);
}
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);
}
}
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);
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
}
}
@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);
}
}
}