当方向发生变化时,为了获得相同的图形,需要保存哪些信息?
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
View view = getView();
GraphView graphView = (GraphView) view.getTag(ParentActivity.GRAPH_VIEW_TAG);
// I currently have only one GraphViewSeries but I will have one more.
// I couldn't figure out what to do next in order to have the same graphs
// before orientation change occurred.
}
图表中显示实时数据。我并不担心在方向转换过程中获得的数据。
感谢您的支持和/或指导。
答案 0 :(得分:2)
您必须保存系列的数据并将其恢复。你是如何完全自由的。例如,你可以这样做:
浏览系列的所有数据并将其保存为浮点列表,一个用于x值,一个用于y值。 一个问题是,在GraphView之前的4.0.0中,系列的内部数据阵列受到保护,因此您无法访问它。 一种方法是覆盖它来改变它,另一种方法是将数据缓存存储在一个自己的数组中。
方式#1: 创建GraphViewSeries子类并覆盖它以使数据数组公开:
class DataVisibleGraphViewSeries extends GraphViewSeries {
public GraphViewDataInterface[] getValues() {
return values;
}
// expose constructor 1
public GraphViewSeries(GraphViewDataInterface[] values) {
super(values);
}
// expose constructor 2
public GraphViewSeries(String description, GraphViewSeriesStyle style, GraphViewDataInterface[] values) {
super(description, style, values);
}
}
// no use this class DataVisibleGraphViewSeries to create series
方式#2:
创建一个私有成员来存储值的副本。创建Series对象时,请将数据保存到您的成员。
在GraphView 4.0.0之前,也无法从GraphView对象中获取系列对象。因此,唯一的方法是将您的系列存储在私有成员(例如mSeries)中。
下一步是保存您的州。 保存状态:
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
View view = getView();
GraphView graphView = (GraphView) view.getTag(ParentActivity.GRAPH_VIEW_TAG);
// if you have chosen way #1 and you have your series object stored in a member "mSeries" then you can access the data like that
GraphViewDataInterface[] data = mSeries.getValues();
double[] xValues = new double[data.size()];
double[] yValues = new double[data.size()];
for (int i=0; i<data.size(); i++) {
xValues[i] = data.get(i).getX();
yValues[i] = data.get(i).getY();
}
// save it
outState.putDoubleArray("xValues", xValues);
outState.putDoubleArray("yValues", yValues);
}
要恢复数据,您必须从数据包中获取数据并重置系列。
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ... create your views and your mSeries member must be initialized here
if (savedInstanceState != null && savedInstanceState.getDoubleArray("xValues") != null) {
double[] xValues = savedInstanceState.getDoubleArray("xValues");
double[] yValues = savedInstanceState.getDoubleArray("yValues");
// create data array
GraphViewDataInterface[] data = new GraphViewDataInterface[xValues.length];
for (int i=0;i<xValues.length;i++) {
data[i] = new GraphViewData(xValues[i], yValues[i]);
}
mSeries.resetData(data);
}
}
我从未测试过该代码,也许有一些语法/拼写错误,但至少你应该知道如何管理它。这适用于一个系列,但您可以将其扩展为更多功能,只需保存系列的数量并浏览xValues0,xValues1,xValues2等名称......
干杯 纳斯
答案 1 :(得分:0)
关于UI状态的一切。每一条数据(除非您能够并且想要重新计算或重新获取),对UI的每次更改都无法重新计算,包括可能已输入的任何数据或用户更改的UI状态。
除非您对纵向模式和横向模式有完全不同的布局,否则我强烈建议您在清单中设置configChange以关闭旋转时的Activity重新创建。这只是一个坏主意,即使有90%的谷歌自己的应用程序也将其关闭。它可以正常工作,如果你有一个简单的屏幕应用程序,它只是不适合任何真正的复杂性。特别是如果您有任何后台线程或AsyncTasks,因为它们不能平滑地处理重建并且将引用不再存在的陈旧UI元素。