9

Struktura aplikacji jest w następujący sposób:nie onActivityResult zadzwonić Fragment

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

1. Kod aktywności:

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

2. Kod w HomeFragment (Zauważ, że HomeFragment nie jest faktyczną funkcją, ale takim kontenerem i rozszerza 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. We własnym domu (Rzeczywista zawartość fragmentu)

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

5. A w UploadType, nazywam działanie kamery, ale onActivityResult jest zwracany tylko w głównej aktywności.

startActivityForResult(intent, REQUEST_CAMERA); 

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

Jak mogę wyzwolić onActivityResult w UploadType? Dzięki za pomoc.

+1

Fragmenty nie obsługują onActivityResult, ale aktywność –

+1

spróbować tej startActivityFromFragment (YourFragment.this, intencji, REQUEST_CAMERA); – SathishKumar

+0

Dzięki za pomoc. Czy istnieje sposób na wywołanie fragmentu funkcji ActivityResult wewnątrz głównej? Ponieważ zmieniłem fragment (z Home() na UploadTab(), jak mogę uzyskać ten fragment? Dzięki) – user782104

Odpowiedz

25

Powód, dla którego s nie działa, ponieważ wywołujesz startActivityForResult() z zagnieżdżonego fragmentu. Android jest wystarczająco inteligentny, aby skierować wynik z powrotem na numer Activity, a nawet Fragment, ale nie do zagnieżdżonego Fragment, dlatego nie otrzymujesz oddzwaniania. (więcej informacji, dlaczego to nie działa here lub na stackoverflow)

Teraz w celu uczynienia go pracy Proponuję ręcznie trasa zwrotnego do ChildFragment (= UploadType) w 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); 
} 
+0

http://inthecheesefactory.com/blog/how-to-fix-nested-fragment-onactivityresult-issue/en – John

8

W swojej aktywny Override onActivityForResult() jak ten

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

Teraz w swoim fragmentem u można uzyskać wynik aktywności wewnątrz tego

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

upewnij się że po swojej wzywają rozpocząć ActivityForResult w frragment Powinno to być takie:

startActivityForResult(intent, REQUEST_CAMERA); 
+0

Wielkie dzięki, czy mogę umieścić onActivityResult również w BaseContainerFragment/HomeFragment? – user782104

+1

Umieść na ActivityResult od miejsca, w którym dzwonisz pod numer startActivtyForResult – goonerDroid

+0

Dzięki. jeszcze jedno pytanie, co jeśli więcej niż jeden fragment ma startActivityForResult? – user782104

11

w moim przypadku zrobiłem dodając następujący kod w moim 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); 
    } 
} 
+1

najlepsza odpowiedź dzięki bardzo dużo @ Ka7lm1011 – Hoby

0

TabActivity-> ActivityA-> FragmentB, to nie działa.

używać w zły, zły sposób:

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 
    } 
} 
Powiązane problemy