Android onRestoreInstanceState - 如何在屏幕方向改变后恢复对象?

问题描述 投票:0回答:1

我正在尝试编写我的第一个Android应用程序。我有3个片段,每个片段都有相同的UI,它自己的对象叫做Rota#number。我有典型的begginers问题:如何在屏幕方向改变后保持我的对象?我想恢复Rota1-Rota3对象,getKryptonim()和Rota类的getter只是为了测试。而不是我收到的恢复对象 空对象引用上的'java.lang.String com.firetrap.android.firetrapair.Rota.getKryptonim()'

主要活动是:

public class MainActivity extends AppCompatActivity {

private static final String TAG = "FireTrapAir";

private Button mRota1_button;
private Button mRota2_button;
private Button mRota3_button;

private Rota mRota1;
private Rota mRota2;
private Rota mRota3;

private Fragment fragmentR1;
private Fragment fragmentR2;
private Fragment fragmentR3;

public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d(TAG,"onSaveInstanceState()");
    outState.putSerializable("ROTA1", mRota1);
    outState.putSerializable("ROTA2", mRota2);
    outState.putSerializable("ROTA3", mRota3);

}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate()");
    setContentView(R.layout.activity_main);

    final FragmentManager fm = getSupportFragmentManager();

        Rota mRota1 = new Rota();
        Rota mRota2 = new Rota();
        Rota mRota3 = new Rota();


    Fragment fragmentR1 = RotaFragment.newInstance(mRota1);
    Fragment fragmentR2 = RotaFragment.newInstance(mRota2);
    Fragment fragmentR3 = RotaFragment.newInstance(mRota3);

    fm.beginTransaction().add(R.id.r1dane_container, fragmentR1).commit();
    fm.beginTransaction().add(R.id.r2dane_container, fragmentR2).commit();
    fm.beginTransaction().add(R.id.r3dane_container, fragmentR3).commit();
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    Log.d(TAG, "onRestoreInstanceState()");

    if (savedInstanceState != null) {
        Rota mRota1 = (Rota) savedInstanceState.getSerializable("ROTA1");
        Log.d(TAG, "onRestoreInstanceState(): ROTA1" + mRota1.getKryptonim());
        Rota mRota2 = (Rota) savedInstanceState.getSerializable("ROTA2");
        Log.d(TAG, "onRestoreInstanceState(): ROTA2" + mRota2.getKryptonim());
        Rota mRota3 = (Rota) savedInstanceState.getSerializable("ROTA3");
        Log.d(TAG, "onRestoreInstanceState(): ROTA3" + mRota3.getKryptonim());
    }
}

}

RotaFragment显示Rota类属性。

罗塔班是:

public class Rota implements Serializable {
    private UUID mId;
    private String mKryptonim;
    private String mStrazak1;
    private String mStrazak2;
    private String mMiejsceDzialan;
    private String mKanalRadiowy;
    private String mKanalKRG;
    private Integer mCisnienieWejscia;
    private Date mWejscie;

    public Rota() {

        Calendar localCalendar = Calendar.getInstance(TimeZone.getDefault());

        mId = UUID.randomUUID();
        mWejscie = new Date();
        mKryptonim = "podaj kryptonim";
        mStrazak1 = "strażak1";
        mStrazak2 = "strażak2";
        mMiejsceDzialan = "miejsce działań";
        mKanalRadiowy = "B004";
        mKanalKRG = "KRG 1";
        mCisnienieWejscia = 0;
        mWejscie = localCalendar.getTime();
    }
.... getters and setters
}
android
1个回答
0
投票

问题:在您的活动类中,有3个类变量

private Rota mRota1;
private Rota mRota2;
private Rota mRota3;

但是在onCreate()方法中,您创建了3个具有相同名称的局部变量

Rota mRota1 = new Rota();
Rota mRota2 = new Rota();
Rota mRota3 = new Rota();

所以3个类变量总是为null,这就是你得到错误的原因。

解决方案:将活动中的代码更改为

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG,"onCreate()");
    setContentView(R.layout.activity_main);

    if (savedInstanceState == null) {
        mRota1 = new Rota();
        mRota2 = new Rota();
        mRota3 = new Rota();
    } else {
        mRota1 = (Rota) savedInstanceState.getSerializable("ROTA1");
        Log.d(TAG, "onRestoreInstanceState(): ROTA1" + mRota1.getKryptonim());
        mRota2 = (Rota) savedInstanceState.getSerializable("ROTA2");
        Log.d(TAG, "onRestoreInstanceState(): ROTA2" + mRota2.getKryptonim());
        mRota3 = (Rota) savedInstanceState.getSerializable("ROTA3");
        Log.d(TAG, "onRestoreInstanceState(): ROTA3" + mRota3.getKryptonim());
    }

    final FragmentManager fm = getSupportFragmentManager();
    Fragment fragmentR1 = RotaFragment.newInstance(mRota1);
    Fragment fragmentR2 = RotaFragment.newInstance(mRota2);
    Fragment fragmentR3 = RotaFragment.newInstance(mRota3);

    fm.beginTransaction().add(R.id.r1dane_container, fragmentR1).commit();
    fm.beginTransaction().add(R.id.r2dane_container, fragmentR2).commit();
    fm.beginTransaction().add(R.id.r3dane_container, fragmentR3).commit();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Log.d(TAG,"onSaveInstanceState()");
    outState.putSerializable("ROTA1", mRota1);
    outState.putSerializable("ROTA2", mRota2);
    outState.putSerializable("ROTA3", mRota3);
}
© www.soinside.com 2019 - 2024. All rights reserved.