旋转屏幕时,TextView值无法恢复 - Android

时间:2014-12-11 09:46:18

标签: android android-layout textview android-orientation onconfigurationchanged

我查看了其他帖子并尝试了建议的解决方案,但没有一个对我有用。我有一个简单的应用程序,它有一个按钮和Textview,当用户按下按钮时,TextView中的值将增加1.(textview只有数字)。

我的纵向和横向模式有不同的布局,我可以通过在我的XML android:freezesText="true"中使用此代码来冻结屏幕方向的值。但是,我现在遇到的问题是,当用户按下按钮以使TextView的值增加1时,在屏幕方向上,textview中的值从0开始。例如

例如在纵向模式下,值为23,当用户将屏幕旋转到横向并按下按钮时,该值将返回1.如何使值从23开始。

以下是我的代码;

人像布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/textview"/>

    <Button
        android:id="@+id/up"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/up" />

</LinearLayout>

Landspace布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/textview"/>

    <Button
        android:id="@+id/up"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="@string/up" />

</LinearLayout>

Java代码

int counter = 0;
TextView textview;

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



        textview = (TextView)findViewById(R.id.textview );


        final Button up = (Button)findViewById(R.id.up);
        up.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                counter++;
                textview.setText("" + counter);

            }
        });
    }

3 个答案:

答案 0 :(得分:3)

您需要覆盖onSaveInstanceState(Bundle savedInstanceState)并将要更改的应用程序状态值写入Bundle参数,如下所示。即使设备方向已更改,也会保存数据。

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

      UI();

}

public void UI() {

    textview = (TextView)findViewById(R.id.textview );

    final Button up = (Button)findViewById(R.id.up);
    plus.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            count++;
            textview.setText("" + counter);

        }
    });
}

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

    UI();
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);

    savedInstanceState.putString("key_name", textview.getText().toString());
    savedInstanceState.putInt("count", ""+count);

}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);{

     textview.setText("" + savedInstanceState.getString("key_name"));
     count = savedInstanceState.getInt("count")

}

答案 1 :(得分:1)

在我看来,你正在增加一个错误的变量。

@Override
public void onClick(View v) {
    count++;
    textview.setText("" + counter);
}

另外,在onCreate方法中执行此操作:

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



    textview = (TextView)findViewById(R.id.textview );
    textview.setText("" + counter);  //Add this line to automatically set the value


    final Button up = (Button)findViewById(R.id.up);
    plus.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            count++;
            textview.setText("" + counter);

        }
    });
}

答案 2 :(得分:1)

可能以某种方式重新加载从纵向到横向的活动参数,因此在旋转时会再次将counter值重置为0。您可以尝试将其设为static变量以避免冲突。

private static int counter = 0;