TabsPagerAdapter屏幕方向丢失实例

时间:2014-11-03 09:10:59

标签: android android-fragments android-adapter android-orientation

我有FragmentActivity我在其中制作片段:

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

}

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

我该如何解决这个问题?

编辑: 当我使用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);
        }
    }

1 个答案:

答案 0 :(得分:0)

将android:configChanges =“orientation | keyboardHidden | screenSize”添加到清单文件中的活动标签。这将在定向时保留数据。希望这会对你有帮助:)