-1

As i am new to android I stuck to some point while implementing ActionBarTab with swipable viewpager using fragments

I have 3 tabs each with some controls last tab will submit all tabs data to one table i navigate through next button and with tab change event

using next tab i can set data to Class object using getter/Setter and i submit that class data to DB table for save ..

now i want to call same method while tab change event method is SetdataToModelClass()

How to call same method on tab change event which is already called on button click event so if user navigate through tabs instead next button and change any data My SetdataToModelClass() is called

SetdataToModelClass is in every fragment,where as my Tab change event is in MainFragmentActivity class so how to call SetdataToModelClass() method on tab change event (i.e want to have communication between MainFragment Act & Fragment)

Code for MainActivity Class is here:

public class TestFragmentTabHost extends FragmentActivity implements TabListener {
ViewPager vp;
ActionBar ab;   
SalesActivity sa = new SalesActivity();
SessionManager session = null;
String usrNm = null;    
String szImeiId = null;
Spinner spnAECust;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabhost_act);

    /* Action Bar Color change on create*/  
    ActionBar actionBar = getActionBar();
    ActionBarColor.setBackgroundColor(actionBar);
    getActionBar().setDisplayHomeAsUpEnabled(true);     
    getActionBar().setTitle(Html.fromHtml("<font color=\"white\" face=\"verdana,arial\">" + getString(R.string.air) + "</font>"));

    // Session Manager
    session = new SessionManager(getApplicationContext());

    /* To Get Unique Device id */
    TelephonyManager TelephonyMgr = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
    szImeiId = TelephonyMgr.getDeviceId(); // Requires READ_PHONE_STATE.

    // get User Details from Session
    HashMap<String, String> hashMap = new HashMap<String, String>();
    hashMap = session.getUserDetails();
    usrNm = hashMap.get(SessionManager.KEY_USRNM);      

    vp = (ViewPager) findViewById(R.id.pager);
    vp.setAdapter(new MyPageAdapter(getSupportFragmentManager()));

    ab = getActionBar();
    ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    ActionBar.Tab tab1 = ab.newTab();
    tab1.setText("INFO");
    tab1.setTabListener(this);

    ActionBar.Tab tab2 = ab.newTab();
    tab2.setText("PORT");
    tab2.setTabListener(this);


    ActionBar.Tab tab3 = ab.newTab();
    tab3.setText("PACKAGES");
    tab3.setTabListener(this);

    ab.addTab(tab1);
    ab.addTab(tab2);
    ab.addTab(tab3);        

}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    vp.setCurrentItem(tab.getPosition());

}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
}

// For Page adapter
class MyPageAdapter extends FragmentPagerAdapter {

    public MyPageAdapter(FragmentManager fm) {
        super(fm);
        // TODO Auto-generated constructor stub
    }

    @Override
    public Fragment getItem(int arg0) {
        Fragment frgmnt = null;
        if (arg0 == 0) {
            frgmnt = new InfoFragment();                    
        }else if (arg0 == 1) {
            frgmnt = new PortFragment();
        }else if (arg0 == 2) {
            frgmnt = new PackagesFragment();
        }
        return frgmnt;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 3;
    }

}




 public void setSalesInfoData(List<String> sales) {     
        while (sales.size() > 0) {                  
            sa.setCustomerId(Integer.parseInt(sales.get(0).toString()));
            sa.setProspectId(Integer.parseInt(sales.get(1).toString()));
            sa.setCommodityId(Integer.parseInt(sales.get(2).toString()));
            sa.setSpecialNotes(sales.get(3));
            sa.setLob(sales.get(4));
            DateFormat dt = new DateFormat();
            Date crTs = dt;
            sa.setCrTs(crTs);
            sa.setCrUsr(usrNm);         
            sa.setDeviceId(szImeiId);
            break;
        }

    }

using method to setdata to Class SalesActivity

Kishan Dhamat
  • 3,746
  • 2
  • 26
  • 36
Aditi K
  • 1,534
  • 5
  • 22
  • 43
  • you need to use a interface as a callback to the activity. check communicating with activity @ http://developer.android.com/guide/components/fragments.html – Raghunandan Jan 27 '14 at 11:04
  • the better way would always be to use an Interface like @Raghunandan suggested. But you can also simply get reference of your activity in Fragment and call your function on it. for more info checkout: http://stackoverflow.com/questions/21252503/android-how-to-access-a-getter-method-in-parent-activity-from-fragment/21252529#21252529 – vipul mittal Jan 27 '14 at 11:07
  • aditi last time i told u abt singleton class have u read that class dear – Bhanu Sharma Jan 27 '14 at 11:08
  • please read that class that one is very easy to store or access any data in our app – Bhanu Sharma Jan 27 '14 at 11:09
  • @BhanuSharma i have to implement in short tym..no tym to read ..please send me code ..sorry but urgent – Aditi K Jan 27 '14 at 11:11
  • @vipulmittal i want exact opposite want to access fragment method/view into main action – Aditi K Jan 27 '14 at 11:12
  • you can simple do it on the fragment object. preserve fragment object and call function on it. Are you using a FragmentPagerAdapter? can you post your code for on tab change?? – vipul mittal Jan 27 '14 at 11:15
  • check code above edited – Aditi K Jan 27 '14 at 11:18

1 Answers1

2

change adapter to:

class MyPageAdapter extends FragmentPagerAdapter {
    Fragment[] fragments=new Fragment[3];

    public MyPageAdapter(FragmentManager fm) {
        super(fm);
         fragments[0]= new InfoFragment();                    
         fragments[1]= new PortFragment();
         fragments[2]= new PackagesFragment();
    }

    @Override
    public Fragment getItem(int arg0) {
       return fragments[arg0];
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 3;
    }
}

And in onTabUnselected get the fragment call the function ex:

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
     Fragment fragment=adapter.getItem(tab.getPosition());
   if(fragment instanceof InfoFragment){
       ((InfoFragment)fragment).SetdataToModelClass();
   }
   if(fragment instanceof PortFragment){
       ((PortFragment)fragment).SetdataToModelClass();
   }
   if(fragment instanceof PackagesFragment){
       ((PackagesFragment)fragment).SetdataToModelClass();
   }
}

Also make adapter object a class variable ex:

ontside onCreate

MyPageAdapter adapter;

in onCreate

adapter=new MyPageAdapter(getSupportFragmentManager());
vp.setAdapter(adapter);
vipul mittal
  • 17,343
  • 3
  • 41
  • 44
  • i cant access SetdataToModelClass();adapter.getItem(tab.getPosition()).SetdataToModelClass(); – Aditi K Jan 27 '14 at 11:30
  • check my edited ans. this should work but a better way would be to create an Interface with SetdataToModelClass and make all fragments implement that interface and just type cast into Interface and call SetdataToModelClass. – vipul mittal Jan 27 '14 at 11:35
  • don't forget to accept if my ans has help you solve your problem ;-) – vipul mittal Jan 27 '14 at 11:53