0

我有一个FragmentActivity中,我让我的片段:TabsPagerAdapter屏幕方向失去实例

viewPager = (ViewPager) findViewById(R.id.pager); 
    actionBar = getActionBar(); 
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager()); 

    viewPager.setAdapter(mAdapter); 
    actionBar.setHomeButtonEnabled(false); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);   

    String[] tabs = { 
      getResources().getString(R.string.loginData), 
      getResources().getString(R.string.firmData) 
    }; 

    // Adding Tabs 
    for (String tab_name : tabs) { 
     actionBar.addTab(actionBar.newTab().setText(tab_name) 
       .setTabListener(this)); 
    } 

我创建2个片段,并在这两个我对这个表格的形式和验证。在第二个片段上,我保存了button ** **第一个片段的**触发验证*并获得结果。

这是我的适配器:

public class TabsPagerAdapter extends FragmentPagerAdapter { 

private BasicData1Fragment fragment; 

public TabsPagerAdapter(FragmentManager fm) 
{ 
    super(fm); 
} 

public void validateBasicData1Fragment() 
{ 
    if(fragment != null) 
    { 
     fragment.validationCheck(); 
    } 
} 

@Override 
public Fragment getItem(int index) { 
    switch (index) { 
    case 0: 
     fragment = new BasicData1Fragment(); //shranimo si referenco na fragment 1, da lahko kaseneje poklicemo metodo 
     return fragment; 
    case 1: 
     // Games fragment activity 
     return new BasicData2Fragment(); 
    } 

    return null; 
} 

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

} 

我现在的问题是,如果屏幕旋转适配器,我在getItem保存为空适配器换句话说片段失去对BasicData1Fragment实例。

我该如何解决这个问题?

编辑: 当我使用setRetainInstance(true); 问题得到了解决,但另一个问题出现了。 如果我改变方向,我的验证会停止工作。

然后,我通过在oncreate中创建editviews一次(使用setRetainInstance(true))来修正验证,但之后我再次丢失了实例。

输入验证码:

public void validationCheck() 
{ 
    if(loginFirstName.getText() == null || loginFirstName.getText().toString().isEmpty()) 
    { 
     loginFirstName.setError(getString(R.string.requiredErrorMessage, getString(R.string.firstName))); 
     errors[0] = true; 
    } 
    else 
    { 
     loginFirstName.setError(null); 
     errors[0] = false; 
    } 

    if(loginLastName.getText() == null || loginLastName.getText().toString().isEmpty()) 
    { 
     loginLastName.setError(getString(R.string.requiredErrorMessage, getString(R.string.lastName))); 
     errors[1] = true; 
    } 
    else 
    { 
     loginLastName.setError(null); 
     errors[1] = false; 
    } 

    if(username.getText() == null || username.getText().toString().isEmpty()) 
    { 
     username.setError(getString(R.string.requiredErrorMessage, getString(R.string.username))); 
     errors[2] = true; 
    } 
    else 
    { 
     username.setError(null); 
     errors[2] = false; 
    } 

    //ce je geslo prazno ->nobenega errorja 
    if(password.getText().toString().isEmpty()) 
    { 
     errors[3] = false; 
     errors[4] = false; 
     Global.LoginRequired = false; 
     password.setError(null); 
    } 
    else if(!password.getText().toString().isEmpty()) //ce ni prazno, mora obstajati tudi potrditev, ki seujema 
    { 
     if(!password.getText().toString().equals(passwordConfirm.getText().toString())) 
     { 
      passwordConfirm.setError(getString(R.string.passwordsDoesntMatch)); 
      errors[4] = true; 
     } 
     else 
     { 
      errors[3] = false; 
      errors[4] = false; 
      Global.LoginRequired = true; 
      passwordConfirm.setError(null); 
     } 
    } 
+0

使这些片段为setRetainInstance(true);那么你可以使用相同的片段实例,即使在屏幕上更改为 – San 2014-11-03 09:38:21

+0

我试过,但有其他问题。我编辑了我的问题与结果。 – 2014-11-03 10:47:33

+0

不要在getItem中创建片段,创建片段,列表并通过适配器构造函数传递 – San 2014-11-03 10:56:24

回答

0

添加机器人:configChanges = “方向| keyboardHidden |屏幕尺寸” 到清单文件的活动标签。这将在定位时保存数据。希望这会帮助你:)

+0

我不想这样做,因为我的布局需要重新创建,而我正在使用onSaveInstanceState来保存我的数据。 – 2014-11-03 09:23:31

+0

请检查[this](http://stackoverflow.com/questions/6787071/android-fragment-how-to-save-states-of-views-in-a-fragment-when-another-fragmen) – ashutiwari4 2014-11-03 09:31:54