0

Hi am working on nested fragments. My Activity having two Tabs called Frag1 and Frag2. The Frag1 has children Tab named FragA and Frag B. From FragA i am calling one activity and i am returning its result to Fragment Activity. So based on the result i need to reload or recreate the FragA. Please some one tell me, how to pass vales from ParentFragment's onActivityResult() to child Fragment FragA. Thanks in advance.

Top level fragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub

    mTabHost = new FragmentTabHost(getActivity());
    mTabHost.setup(getActivity(), getChildFragmentManager(), R.layout.fragment_tabhost);

    arg1 = new Bundle();
    arg1.putString("tab", "tab1");
    mTabHost.addTab(mTabHost.newTabSpec("Tab1").setIndicator("Tab1"),
            FragmentTestA.class, arg1);

    arg1 = new Bundle();
    arg1.putString("tab", "tab2");
    mTabHost.addTab(mTabHost.newTabSpec("Tab2").setIndicator("Tab2"),
            FragmentTestB.class, arg1);

    arg1 = new Bundle();
    arg1.putString("tab", "tab3");
    mTabHost.addTab(mTabHost.newTabSpec("Tab3").setIndicator("Tab3"),
            FragmentTestC.class, arg1);

    return mTabHost;
}

FragmentTestA:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    mainView = inflater.inflate(R.layout.frag, null);

    // initially load default fragment here
    fg = new DefaultFragment();
    replaceFragment(fg);

    if (getArguments() != null) {
        mCurrentTab = getArguments().getString("tab");
    }

    mNotUsedBtn = (Button) mainView.findViewById(R.id.btn2);
    mNotUsedBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
        }
    });

    mUsedBtn = (Button) mainView.findViewById(R.id.btn3);
    mUsedBtn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
        }
    });

    return mainView;
}

DefaultFragment:

      @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    mainView = inflater.inflate(R.layout.deal_list, null);

    mExpSoon = getArguments() != null ? 
            getArguments().getString("expiring_soon") : "";
    mStatus = getArguments() != null ? 
            getArguments().getString("status") : "";
    mCurrentTab = getArguments() != null ? 
            getArguments().getString("tab") : "";
        mListView.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View v, int position,
                long id) {
            // TODO Auto-generated method stub
               Calling Activity from here
        }
    }); 



    return mainView;
}

So the intent called and it returns some result. how do we pass values to the last child to perform action based on the result. I am getting result to onActivityResult() from this how to send data to last activity.

Tobrun
  • 18,291
  • 10
  • 66
  • 81
Ria
  • 873
  • 1
  • 10
  • 25
  • Fragment to fragment communication should always go via the hosting activity using interfaces, these interfaces should be attached to the fragment in the onActivityAttached callback of a fragment – Tobrun Dec 30 '13 at 09:58

2 Answers2

0

you could use ViewFlipper instead of Tab. Here you can use same FragmentActivity class and also onActivityResult(...) method. e.g

   vFlipper = (ViewFlipper) view.findViewById(R.id.ViewFlipper_tab);

     info.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub


            vFlipper.setDisplayedChild(0);
        }
    });

    mat.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub



            vFlipper.setDisplayedChild(1);
        }
    });
Saj
  • 849
  • 7
  • 12
0

You should implement this, that is something i saw on the web but i dont remember where:

Interface class

interface Communicator{
    void doSomething();      
    SomeClass getSomething();
}

MainActivity or CurrentActivity(the actitvity where the fragments are called)

public class SomeActivity extends .... implements ....,Communicator{
    SomeClass object;
    .......
    public void doSomething(){
        object=someOperation;
    }
    public Someclass getSomething(){
        return object;
    }
    ........
}

Any fragment

public class yFragment extends fragment implements ....{
    Communicator communicator;
    public onCreate(...................){
        .........
        communicator=(Communicator)getActivity();
        .........
    }
    ......................................
    public someMethod(){
         .............
         communicator.doSomething();
         ............
    }
    ...........
}

Any other fragment even a nested fragment

public class XFragment extends fragment implements ....{
        Communicator communicator;
        public onCreate(...................){
            .........
            communicator=(Communicator)getActivity();
            .........
        }
        ......................................
        public someMethod(){
             .............
             variable=communicator.getSomething();
             ............
        }
        ...........
    }

This works for me i send "data" to my main activity store it there and then when i want it back i recover that data with the interface.
PSDT: ....... means some parameters or methods go here

Carlos Zerga
  • 190
  • 3
  • 10