Android中的屏幕旋转时,视图是清晰的数据

时间:2011-10-17 05:31:26

标签: android

我有一个在运行时创建的 View 然后我在该视图(运行时)上绘制了一些画布,之后我旋转了我的屏幕。所有数据都消失了(重置因此,我将一些代码放在 AndroidManifest.xml 中,就像这样

android:configChanges="keyboardHidden|orientation"

在我的<activity>中,我放了一个@Override函数

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);      
  setContentView(R.layout.main);
  LinearLayout layout = (LinearLayout) findViewById(R.id.myPaint);
  layout.addView(mView); 
}

但是一切都无法解决我的问题。我想在每次轮换时保持我的数据来自View(运行时)。

这是我的onCreate功能。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mView = new MyView(this);
    setContentView(mView);

    mView.requestFocus();
    setContentView(R.layout.main);
    LinearLayout layout = (LinearLayout) findViewById(R.id.myPaint);
    layout.addView(mView);
}

3 个答案:

答案 0 :(得分:2)

您需要保存并加载要保留的数据。即使您按照自己的方式修改了Manifest时自己也在处理屏幕旋转,但您仍然需要自己重新加载视图。重读有关处理运行时更改的参考文档。您需要存储数据并相应地重新加载。否则,当应用程序重新启动或重新加载ContentView时,它将丢失。

http://developer.android.com/guide/topics/resources/runtime-changes.html

答案 1 :(得分:1)

你可以通过几种方式来解决这个问题。

我认为MyView是你自己的类,它扩展了View。如果是这样,您可能需要了解两种方法,onSaveInstanceState()onRestoreInstanceState()。保存时,创建一个包含足够数据的parcelable,以便在视图被销毁和重新创建时重新呈现视图。

class MyView extends View {
   private String mString;

   onDraw(Canvas v) { ... }

   Parcelable onSaveInstanceState() {
    Bundle b = new Bundle();
    bundle.putString("STRING", mString);
    return b;


   void onRestoreInstanceState(Parcelable c) {
    Bundle b = (Bundle) c;
    mString = bundle.getString("STRING", null);

   }
}

Activity在onCreate和onSaveInstanceState()中允许使用类似的状态保存机制(在Activity中,而不是在本例中为View),这将允许活动将其视图的状态重置为所需的状态。

这可以解决你的大多数担忧。如果你想使用onConfigurationChanged方法,那么你应该重新提出你的问题,因为不清楚在每种情况下你不期望的当前行为(仅使用onConfigurationChanged,或仅使用onCreate,或使用两者等) )。

答案 2 :(得分:0)

我刚刚将我的数据类用作单例(java-pattern)。 它工作正常。 - &GT;应用程序是赛车的停止计时器,我可以在赛道上停止不同对手的时间,所以我需要更长时间的数据,如果视图重新绘制。

regz

public class Drivers {
// this is my singleton data-class for timing

private static Drivers instance = null;

public static Drivers getInstance() {
        if (instance == null) {
            instance = new Drivers();
        }
        return instance;
    }
    // some Timer-Definitions.......
}

然后在MainActivity中:

    // now the class is static, and will alive during application is running
    private Drivers drivers = Drivers.getInstance();

    @Override
    public void onClick(View v) {
        if (v == runButton1) {
           drivers.startTimer1();
            // do some other crazy stuff ...
        }
    }

    // here i put out the current timing every second
    private myUpdateFunction(){
        time01.setText(drivers.getTimer1());
        // update other timers etc ...
    }