2016-12-13 54 views
0

我知道這已被問了很多次,但我不能讓這個工作。我使用兩個約束佈局,並且它們之間的切換正常。但是,屏幕上的值會重置,因爲這裏還有其他一百萬個問題。這種行爲看起來非常不一致,因爲我之前在另一個項目中使用過它(它只適用於一項活動,但不適用於另一項活動),但我現在無法使用它。Android的方向,需要保持數據

我運行在Android模擬器我的代碼的Android 7.1.1,API 25

我已經在AndroidManifest.xml

android:configChanges="keyboardHidden|orientation|screenSize" 

<activity> 

public void onConfigurationChanged(Configuration newConfig) { 
      super.onConfigurationChanged(newConfig); 
      if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      setContentView(R.layout.activity_my_activity_land); 
     } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
      setContentView(R.layout.activity_my_activity); 
     } 
    } 

在我的相關活動。

方向更改和佈局正確加載,但值仍然重置。

我已經看過那些類似的這些問題的答案和許多:

Android activity restarted at orientation change even with configChanges set

layout-land is not working?

Save data and change orientation

什麼辦法可以做到這一點沒有做這樣的建議? (重新創建活動):

https://developer.android.com/training/basics/activity-lifecycle/recreating.html

任何幫助,不勝感激!

回答

0

我認爲你應該存儲你想保留在一個全局變量中的對象,並將它放回每個方向的變化,因爲我猜你的片段沒有被破壞,但你的視圖正在重建。

if (mObject == null){ mObject = new mObject(); } 

,然後你只要把它放回你的佈局或任何你需要像

myFrameLayout.addView(mObject); 

我有我如何設法用的WebView在這裏使用它的一個例子:

private void initUI() { 

    webViewPlaceholder = ((FrameLayout) view.findViewById(R.id.webViewPlaceholder)); 
    // Initialize the WebView if necessary 
    if (myWebView == null) { 
     webViewProgressBar = (ProgressBar) view.findViewById(R.id.webview_progressBar); 
     webViewProgressBar.setScaleY(3f); 
     // Create the webview 
     myWebView = new WebView(activity); 
     WebSettings webSettings = myWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webSettings.setPluginState(WebSettings.PluginState.ON); 
     webSettings.setAllowFileAccess(true); 
     webSettings.setGeolocationEnabled(true); 
     webSettings.setLoadsImagesAutomatically(true); 
     webSettings.setLoadWithOverviewMode(true); 
     webSettings.setUseWideViewPort(true); 
     webSettings.setSupportZoom(true); 
     webSettings.setBuiltInZoomControls(true); 
     myWebView.setLayoutParams(new ViewGroup.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT)); 
     myWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
     myWebView.setScrollbarFadingEnabled(true); 
     mWebAppInterface = new WebAppInterface(activity, this, myWebView); 
     myWebView.addJavascriptInterface((mWebAppInterface), "Android"); 

     myWebView.setWebViewClient(new MyWebViewClient()); 
     myWebView.setWebChromeClient(new GeoWebChromeClient()); 

     // Load a page 
     myWebView.loadUrl(getResources().getText(R.string.url).toString()); 

    } 
    // Attach the WebView to its placeholder 
    webViewPlaceholder.removeAllViews(); 
    webViewPlaceholder.addView(myWebView); 
} 

我只是在我的onCreateView()回調中調用initUI()回調

+0

非常感謝。雖然這有點沉重。我不想在這個意義上重新創建活動。看到不同的佈局爲不同的方向加載,必須有一種方法,使兩個View中的ID保持一致,以保持其值onConfigurationChanged。我已經自己使用它,並已經看到許多使用上述技術的正確答案。我覺得我必須錯過一些明顯的關於我的具體用途。 – Kyrre

+0

我的意思是你可以以編程方式管理視圖並存儲它,只需在兩個佈局中放置一個佔位符即可。當佈局得到重新創建時,所有的佈局根據方向加載。因此,您只需將之前存儲在視圖中的視圖放在佔位符中即可。你沒有存儲整個活動,只是你不想保留的視圖。 –

0

當您定位設備時,它會調用onCreate()您的活動方法並重新繪製您的觀點。爲此,您可以創建一個輔助片段並將您的操作放入該片段中。把這條線setRetainInstance(true);放在你的片段的onCreate()方法中。然後,在AsyncTask課中進行操作。創建兩個方法,如setData(List<T> list)getData()。然後,創建一個接口,用PostExecute回調並將此回調放入onPostExecute()方法中。然後,您可以通過實施您在片段中創建的界面來處理此操作。我有簡單的存儲庫在github可以幫助你。 Eyjoy!本文還可以幫助您:Enjoy

相關問題