2014-12-21 3 views
2

방향 변경이 발생할 때 동일한 그래프를 가지기 위해 저장해야하는 정보는 무엇입니까?JJOE64의 그래프 뷰 : 방향 변경을 관리하는 방법

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

UI 상태에 관한 모든 것. 입력 된 데이터 또는 사용자의 UI 상태가 변경 되어도 다시 계산할 수없는 모든 UI 변경 사항 (재 계산하거나 다시 계산할 수없는 경우).

세로 모드와 가로 모드의 레이아웃이 완전히 다른 경우가 아니면 회전시 Activity 레크리에이션을 끄도록 매니페스트에 configChange를 설정하는 것이 좋습니다. Google 자체 앱의 90 %가 꺼져 버린 것은 나쁜 생각입니다. 1 개의 화면이 복잡하지 않은 방귀 응용 프로그램 인 경우에는 제대로 작동하지만 실제로 복잡하지 않은 응용 프로그램은 제대로 작동하지 않습니다. 이것은 백그라운드 스레드 또는 AsyncTask가 계속 진행되는 경우 특히 유용합니다. 재구성이 원활하게 처리되지 않고 더 이상 존재하지 않는 부실 UI 요소를 참조하기 때문입니다.

+0

조나스을 ... 당신의 일련의 번호를 저장 등 xValues0, xValues1, xValues2와 같은 이름을 통과, 이상 작동

건배 이를 확장 할 수 있습니다 제안에 감사드립니다. 불행히도 가로 및 세로 모드를위한 별도의 레이아웃이 있습니다. UI 스레드로 펌핑하기 전에 실시간으로 제공되는 일부 데이터를 처리해야하므로 AyncTasks를 사용해야합니다. –

+0

그러면 고통의 세계에 빠지게 될 것입니다. 두 가지 옵션 - 활동 레크 리 에이션을 유지할 수 있습니다. 이 경우 위에 언급 한 것처럼 onSaveInstanceState에 모든 UI 데이터를 저장해야하며, 연결된 활동이 이미있는 경우 UI를 업데이트하지 않도록 AsyncTasks의 onPostExecute를 매우 조심해야합니다 의해 파괴됨. 이미 페 데드 된 데이터를 다시 페치하기 위해 네트워크로 되돌려 보내지 않은 요청을 네트워크에 다시 보내지 않도록하려면 로더 패턴을 구현해야하며 불필요한 페치를 방지하기 위해 이러한 작업을 실행하는 데주의해야합니다. –

+0

다른 옵션은 자동 활동 레크리에이션을 해제하는 것입니다. 이는 onConfigChange에서 컨텐츠 뷰를 수동으로 다시로드 한 다음 모든 요소의 UI 상태를 현재 요소와 동일하게 업데이트해야 함을 의미합니다. 하지만 AsyncTasks는 문제가 없으므로 불필요한 가져 오기에 대해 걱정할 필요가 없습니다. –

2

시리즈의 데이터를 저장하고 복원해야합니다. 당신은 당신이 어떻게하는지 완전히 자유 롭습니다. 예를 들어 다음과 같이 할 수 있습니다.

시리즈의 모든 데이터를 검토하여 x 값 하나, y 값 하나를 float 목록으로 저장하십시오. 하나의 문제는 GraphView 4.0.0 이전 버전에서 시리즈의 내부 데이터 배열이 보호되어 액세스 할 수 없다는 것입니다. 한 가지 방법은이를 변경하기 위해 재정의하는 것이며, 다른 방법은 데이터를 자체 배열에 캐시에 저장하는 것입니다.

방법 # 1 : 은 GraphViewSeries 서브 클래스를 생성하고 데이터 배열 공개하기를 오버라이드 (override) :

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); 
    } 
} 

나는 그 코드를 테스트 한 적이 없으며 어쩌면 구문/맞춤법 오류가있을 수 있지만 적어도 지금은 그것을 관리하는 방법을 알고 있어야합니다. 이것은 하나의 시리즈를 위해 작동하지만 당신은

+0

Jonas 대단히 감사합니다. 이 단계는 코드를 약간 변경하여 쉽게 테스트 할 수있었습니다. 나는 내가 appendData 메소드를 오버라이드 할 수는 있지만 setViewPort를 관리해야하기 때문에 "appendData"를해야하기 때문에 이것은 내 케이스에서 (다른 경우에는 작동 할 것입니다.) 단지 작동하지 않는다는 것을 깨달았습니다. Queue 그래서 GraphView 4.0을 시도 할 것입니다. –

+0

4.0을 다운로드 할 수 없으므로 appendData를 재정 의하여 "onCreateView"에 값을 저장합니다. 어떤 이유로 시리즈는 "mSeries.resetData (data)"에 주어진 데이터로 시작하지 않습니다. 어떤 아이디어가 빠져있을 수 있습니다. [데이터에는 유효한 GraphViewDatainterface가 있습니다] –

+0

아니요, 오리엔테이션 변경 직후에 resetData를 사용하십시오. 나중에 그 순간에 그것을 추가하십시오. 또 다른 의미는 뷰포트 (크기 및 오프셋)를 번들에 유지하고 복원하는 것입니다. – appsthatmatter

관련 문제