2013-08-05 19 views
0

我們有供應了通過HTTP發佈的XML文件的Web服務。需要擊中了這個釘子...保留片段和查看onConfigurationChange

我下載和解析這個XML文件轉換爲對象來填充一對夫婦在FragmentPagerAdapter舉行片段裏面的一些看法。我通過AsyncTask得到這個XML文件,它通過一個監聽器接口告訴我的片段該過程已經完成。

從那裏,我填充從Web服務返回的數據片段內的視圖。這一切都很好,直到方向改變。據我瞭解,在ViewPager的適配器是應該保留它創建的片段,這是很好的,而且我希望發生的事情,我知道片段的onCreateView方法仍然是所謂返回視圖。我花了最後一天左右的時間來瀏覽帖子和Google文檔等,我找不到一個具體的方法讓我做我想做的事:保留片段,並且它已經填充了視圖,以便我可以只需在方向更改時將其恢復,並避免對Web服務進行不必要的調用。

一些代碼片段:

在主要活動onCreate:在主要活動

mViewPager = (ViewPager) findViewById(R.id.viewpager); 
if (mViewPager != null) { 
    mViewPager.setAdapter(new PagerAdapter(getSupportFragmentManager())); 
} 

if (savedInstanceState == null) { 
    if (CheckCredentials()) { 
     Refresh(0,0); 
    } else { 
     ShowCredentialsDialog(false); 
    } 
} 

刷新方法...

public void Refresh(Integer month, Integer year) { 
    if (mUpdater == null) { 
     mUpdater = new UsageUpdater(this); 
//  mUpdater.setDataListener(this); 
    } 

    if (isConnected()) { 
     mUpdater.Refresh(month, year); 
     usingCache = false; 
     mProgress.show(); 
    } else { 
     mUpdater.RefreshFromCache(); 
     usingCache = true; 
    } 
} 

這是有問題的片段整,減去一些的UI填充代碼,因爲在文本瀏覽等中顯示文本的設置並不重要...

public class SummaryFragment extends Fragment implements Listeners.GetDataListener { 

    private static final String KEY_UPDATER = "usageupdater"; 
    private UsageUpdater mUpdater; 
    private Context ctx; 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     this.ctx = activity; 
    } 

    private View findViewById(int id) { 
     return ((Activity)ctx).findViewById(id); 
    } 

    public void onGetData() { 
     // AsyncTask interface method, will be called from onPostExecute. 
     // Populate view from here 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     super.onCreateView(inflater, container, savedInstanceState); 
     View view = inflater.inflate(R.layout.fragment_usagesummary, container, false); 
     mUpdater = (UsageUpdater) getArguments().getSerializable(KEY_UPDATER); 
     mUpdater.setDataListener(this); 
     return view; 
    } 
} 

如果我理解了這個問題,那是我在onCreateView中返回一個空視圖,但我不知道如何保留這個片段,返回它預填充數據的視圖,並管理所有調用的Web服務主要活動。

如果你不能告訴,Android是不是我的主要語言,這可能看起來一團糟。任何幫助表示讚賞我越來越沮喪。

回答

0

如果你不使用任何替代資源被重新創建活動時,你可以嘗試通過在AndroidManifest使用configChange標誌自己處理旋轉事件:

<activity 
    ... 
    android:configChanges="orientation|screenSize" 
    ... /> 

有沒有辦法讓同樣,預填景:如果是重新創建你的活動,因爲這會導致一個Context泄漏:

http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/

+0

我讀過,這是對最佳實踐使我避免這樣做。手機處於橫向模式時,我也不想保留縱向視圖。我知道我想要做的事情可以做到,因爲大量的應用程序可以做到,但我試圖找到實現它的正確方法。 – Karl

+0

那麼你很可能需要做的是把'Fragment'中包含您的'ViewPager'和'FragmentPagerAdapter'以及數據支持的適配器將MainActivity佈局。 ... outState.putString(key,string);在頂層Fragment的'onSaveInstanceState()'中,保存數據//等等,以便支持您的視圖 ... 然後在頂層片段的onCreateView(): ... 如果(!savedInstanceState = NULL){// 通過重新創建你的適配器,通過改變所選擇的頁面恢復狀態,將數據放入片段等 } – sddamico

+0

這對我來說很好,謝謝。 – Karl