方向改变android时保存活动状态

时间:2012-10-23 02:20:00

标签: android

我有一个aacplayer应用程序,我希望在方向从纵向更改为横向时保存我的活动状态。 TextViews似乎不是空的,我试图使用这个冻结我的textview:

android:freezesText="true"

我的清单:

android:configChanges="orientation"

我也试过这个:

@Override
    public void onConfigurationChanged(Configuration newConfig){
        super.onConfigurationChanged(newConfig);
        setContentView(R.layout.main2);

因此,当方向更改为横向时,我可以看到我的layout-land main2.xml,但是我的textview会出现并显示为空。流媒体音乐很棒。我可以在方向更改时收听,但每次更改设备的方向时,文本视图中的文本都会消失。

我该怎么做才能解决这个问题,以便保存状态?

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
....
....

非常感谢。

4 个答案:

答案 0 :(得分:57)

当方向发生变化时,您无需手动更改为横向布局文件。 Android会自动为您执行此操作。当方向发生变化时,Android会破坏您当前的活动并再次创建新活动,这就是您丢失文本的原因。

您需要做两件事,假设您需要一个单独的纵向和横向布局。

  1. 假设您有2个用于纵向和横向的XML布局文件,请将main.xml布局文件放在以下文件夹中:

    res / layout / main.xml< - 这将是你的肖像布局
    res / layout-land / main.xml< - 这将是你的风景布局

    这就是您需要做的所有事情,您无需触摸清单文件即可修改android:configChanges="orientation"或覆盖onConfigurationChanged()。实际上,建议您不要触摸它,以达到您想要达到的目的。

  2. 现在从文本视图中保存文本=)让我们假设您的textview在布局xml文件中命名为MyTextView。您的活动需要以下内容:

    private TextView mTextView;
    private static final String KEY_TEXT_VALUE = "textValue";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       mTextView = (TextView) findViewById(R.id.main);
       if (savedInstanceState != null) {
          CharSequence savedText = savedInstanceState.getCharSequence(KEY_TEXT_VALUE);
          mTextView.setText(savedText);
       }
    }
    
    @Override
    protected void onSaveInstanceState (Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putCharSequence(KEY_TEXT_VALUE, mTextView.getText());
    }
    
  3. 基本上,每当Android销毁并重新创建您的活动以进行方向更改时,它会在销毁之前调用onSaveInstanceState()并在重新创建后调用onCreate()。无论您在onSaveInstanceState中保存哪些内容,都可以从onCreate()参数返回。

    因此,您希望在onSaveInstanceState()中保存文本视图的值,并阅读它并在onCreate()中填充textview。如果第一次创建活动(不是由于轮换更改),则onCreate()中的savedInstanceState将为null。您可能也不需要android:freezesText="true"

    如果需要,您还可以尝试保存其他变量,因为在销毁和重新创建活动时,您将丢失存储的所有变量。

答案 1 :(得分:1)

static CharSequence savedText;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedText != null) {
        TextView mTextView = (TextView) findViewById(R.id.main);
        mTextView.setText(savedText);
    }
}

// Another function in activity, when you change text
public void actionButton(View view) {
    // Change and save text in textView
    savedText = "Change text";
    mTextView.setText(savedText);
}

它为我工作。 但我认为它不是很好的代码风格和Android架构。

答案 2 :(得分:1)

有两种方法,第一种是在AndroidManifest.xml文件中。您可以将其添加到活动的标签

android:configChanges="keyboardHidden|orientation|screenSize|screenLayout"

或者您可以重写两种方法来处理此问题。这种方法需要更多的努力,但可以说是更好的方法。 onSaveInstanceState保存活动的状态,然后将其杀死,onRestoreInstanceState将在onStart() Refer to the official documentation之后恢复该信息,以进行更深入的了解。

在下面的示例代码中,我要保存2个int值,微调器中的当前选择以及一个单选按钮。

 @Override
    public void onSaveInstanceState(@NonNull Bundle savedInstanceState) {
        spinPosition = options.getSelectedItemPosition();
        savedInstanceState.putInt(Constants.KEY, spinPosition);
        savedInstanceState.putInt(Constants.KEY_RADIO, radioPosition);
        super.onSaveInstanceState(savedInstanceState);

    }

    // And I am restoring those values with `getInt`, then I can pass those stored values into the spinner and radio button group to select the same values that we saved earlier. 

    @Override
    public void onRestoreInstanceState(@NotNull Bundle savedInstanceState) {
        spinPosition = savedInstanceState.getInt(Constants.KEY);
        radioPosition = savedInstanceState.getInt(Constants.KEY_RADIO);
        options.setSelection(spinPosition, true);
        type.check(radioPosition);
        super.onRestoreInstanceState(savedInstanceState);
    }

答案 3 :(得分:0)

我在 KOTLIN 中使用静态var / val:

class MyFragment : Fragment()
{
     //all my code
     //access to static vars -> MyStaticClass.hello
}

class MyStaticClass 
{
    companion object {
        var hello: String = "Static text"
        var number_static: Int = 0
    }
}