2014-01-27 39 views
-1

由于我是新到Android我坚持一些点,同时实现ActionBarTab与滑动式viewpager使用片段如何在Android中将片段与MainActivity进行通信?

我有3个选项卡每个一些控件最后一个标签都将标签数据提交到一个表 我到明年导航按钮与标签更改事件

使用下一个标签,我可以使用的getter/setter设置数据类对象,我该类数据提交到数据库表中保存..

现在我要打电话,而标签同样的方法更改事件 方法是SetdataToModelClass()

如何调用这已经呼吁按钮的单击事件选项卡上的更改事件相同的方法,因此,如果用户浏览过的标签,而不是下一个按钮,更改任何数据我SetdataToModelClass()被调用

SetdataToModelClass在每一个片段,在那里我的标签更改事件是MainFragmentActivity类,因此如何调用SetdataToModelClass()选项卡上的更改事件方法(即希望有MainFragment法&片段之间的通信)

代码MainActivity类别是在这里:

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; 
     } 

    } 

使用方法SetData的类SalesActivity

+0

你需要使用一个接口作为回调到活动中。检查与活动@ http://developer.android.com/guide/components/fragments.html – Raghunandan

+0

沟通更好的方式总是会使用@Raghunandan建议的接口。但你也可以简单地在Fragment中获取你的活动的参考,并调用你的函数。为更多信息结帐:http://stackoverflow.com/questions/21252503/android-how-to-access-a-getter-method-in-parent-activity-from-fragment/21252529#21252529 –

+0

aditi上次我告诉你abt单身班有你阅读那个班亲爱的 –

回答

2

改变适配器:

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; 
    } 
} 

而且在onTabUnselected获得片段调用该函数前:

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

也使适配器对象一个类变量ex:

ontside onCreate

MyPageAdapter adapter; 

onCreate

adapter=new MyPageAdapter(getSupportFragmentManager()); 
vp.setAdapter(adapter); 
+0

检查我的编辑。让我知道如果不工作 –

+0

我不能访问SetdataToModelClass(); adapter.getItem(tab.getPosition())。SetdataToModelClass(); –

+0

检查我编辑的答案。这应该可行,但更好的方法是使用SetdataToModelClass创建一个接口,并使所有片段实现该接口,并只需在接口中键入cast并调用SetdataToModelClass。 –

相关问题