21

我有一个 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 会消失并显示为空。流媒体音乐效果很好。我可以在方向改变时收听它,但是每次我改变设备的方向时,textviews 中的文本都会消失。

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

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

非常感谢。

4

4 回答 4

59

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

假设您想要纵向和横向的单独布局,您需要做 2 个部分。

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

    res/layout/main.xml <-- 这将是您的纵向布局
    res/layout-land/main.xml <-- 这将是您的横向布局

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

  2. 现在从文本视图中保存文本 =) 假设您的文本视图在布局 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());
    }
    

基本上,每当 Android 销毁并重新创建您的 Activity 以更改方向时,它都会onSaveInstanceState()在销毁之前调用并onCreate()在重新创建之后调用。onCreate()无论您在 onSaveInstanceState 中的包中保存什么,都可以从参数 中取回。

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

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

于 2012-10-23T03:24:17.500 回答
2

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

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

或者,您可以覆盖两个可以解决此问题的方法。这种方法需要更多的努力,但可以说要好得多。onSaveInstanceState保存活动被杀死之前的状态,并在参考官方文档onRestoreInstanceState后恢复该信息以获得更深入的了解。onStart()

在下面的示例代码中,我保存了 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);
    }
于 2020-04-27T13:17:49.367 回答
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 来说不是很好的代码风格和架构。

于 2017-10-16T11:24:35.377 回答
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
    }
}
于 2019-04-09T21:52:52.343 回答