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