我有一个在运行时创建的 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);
}
答案 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 ...
}