2011-05-06 31 views
6

即時通訊將重新問這個問題,因爲有太多糟糕的信息在那裏它的真正令人沮喪。簡短的故事是,當設備方向改變時,我不想要改變或發生任何事情。這個問題最受歡迎的「solutuions」中有2個是:Android - 屏幕方向重新加載活動

1.您可以通過在清單中添加android:screenOrientation =「portrait」(或「landscape」)來鎖定某個方向的活動。

2.您可以通過在標記中指定android:configChanges =「screenOrientation」來告訴系統您想要爲自己處理屏幕更改。這樣,活動將不會被重新創建,但會收到一個回調(您可以忽略,因爲它對您沒有用處)。

這些工作都沒有。所以讓我更詳細地解釋我的特定問題...

我正在試驗一個非常簡單的應用程序作爲學習練習。我在服務器上有一個文本文件。該文本文件中有1件事:單行上的一個整數。這個數字是也存儲在這個服務器上的圖像文件的數量,並且圖像全部命名爲0.jpg,1.jpg,2.jpg等。

我的所有代碼都在我的活動的onCreate方法中就像我說的一個簡單的應用程序)。

應用程序將執行以下運行時:

讀取文本文件的數量。 生成一個從零到文件中數字的隨機數。 通過使用URL中的隨機數將隨機圖像加載到圖像視圖中。

當屏幕旋轉時,我不希望所有這一切再次發生。我只是希望沒有什麼事情發生......除了屏幕應該明顯旋轉並且圖像應該縮放到適合它的位置。但每次屏幕旋轉時,所有代碼都會運行並選擇一個新的隨機圖像。有人可以請給我一個簡單的解決方案與工作代碼來解決這個問題嗎?我通過看到這樣學習,如果你不能提供代碼示例,它不會幫助。

在此先感謝。

ps ...即時通訊不尋找一種不同的方式做即時通訊,這不是重點。即時通訊正在尋找FIX目前正在進行的方式。

+0

啊,你必須在你的代碼中做錯了什麼:'android:configChanges =「screenOrientation」'是處理你想要做的事的方法。如果你已經配置好了,你的'onCreate'不會重新運行。如果它重新運行,那麼你已經配置錯了。把你的代碼放在問題的正文中,我猜測答案應該是非常簡單的。 – Femi 2011-05-06 16:46:49

+1

hhmmm ...你說什麼配置錯了?如果你所說的我唯一需要做的事情就是將這一行添加到我的清單中,我怎麼會這樣做呢? – 2011-05-06 16:57:30

+0

這就是我不確定的,以及爲什麼我要求查看您的代碼。我有工作代碼,每次改變方向時都不會觸發'onCreate()'。 – Femi 2011-05-06 16:59:46

回答

3

一個非常類似的問題在這裏:Don't reload application when orientation changes

不管怎樣,首先,你應該從的onCreate代碼更改爲另一個方法,並通過「創建從網上隨機數和負荷的形象」和「設置圖像劃分它查看」。

您有活性的位圖,你驗證,如果它是空的,每次活動開始。

如果是,盡一切。如果不是,只需使用Bitmap設置ImageView或其他任何東西。

爲了避免破壞位圖旋轉時使用:

Bitmap image = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 

image = (Bitmap) getLastNonConfigurationInstance(); 

    if(bitmap == null){ 
     image = downloadImage(); 
     } 
    setImage(bitmap); 
} 


@Override 
public Object onRetainNonConfigurationInstance() { 
    return bitmap; 
} 

這工作,我敢100%確定。

+1

是的,那是我的問題。沒有解決方案。人們只是在不測試代碼的情況下繼續發佈這些東西。有點荒謬。 – 2011-05-06 16:56:08

+0

@NenetInStEiN:這是JJD的同一個問題。 – techiServices 2011-05-06 16:56:20

+0

請注意,您在此檢索到的數據只能用作處理配置更改的優化。您應該始終能夠處理獲取空指針,並且即使此函數返回null,活動仍必須能夠將其自身恢復到之前的狀態(通過正常的onSaveInstanceState(Bundle)機制)。 – techiServices 2011-05-06 17:18:17

0

例如,添加到清單:

<activity android:name=".Explorer" android:label="@string/app_name" 
      android:configChanges="orientation" android:launchMode="standard"> 
     </activity> 

,然後只覆蓋默認功能:

@Override 
     public void onConfigurationChanged(Configuration _newConfig){ 
      super.onConfigurationChanged(_newConfig); 
int height = getWindowManager().getDefaultDisplay().getHeight(); 
     int width = getWindowManager().getDefaultDisplay().getWidth(); 
     if(width > height){ 
// layout for landscape 
}else{ 
// layout for portrait 
     } 
      } 

注:如果您覆蓋此功能,您必須重做自己的佈局。這是做你想做的唯一方法。 Android的固定屏幕尺寸的方法是將整個活動吹走,並用新尺寸再次提起。如果您選擇不讓它將活動吹走,那麼您必須處理屏幕尺寸更改。沒有其他的選擇。

編輯:在這個特殊的應用程序中,我有一個表格顯示在肖像和一個圖表,顯示在景觀。所以我這樣做:

void showDataView() 
    { 
     setContentView(mainView); 
     currentView = mainView; 
    } 

    void showGraphView() 
    { 
     if(currentView == mainView){ 
      if(graphView == null){ 
       setContentView(R.layout.graphview); 
       graphView = (GraphView)findViewById(R.id.graphview); 
      } 
      setContentView(graphView); 
      currentView = graphView; 
      graphView.setDataToPlot(DATA_TO_PLOT); 
      graphView.clear(); 
     } 
    } 

@Override 
    public void onConfigurationChanged(Configuration _newConfig){ 
     super.onConfigurationChanged(_newConfig); 
     int height = getWindowManager().getDefaultDisplay().getHeight(); 
     int width = getWindowManager().getDefaultDisplay().getWidth(); 
     if(width > height){ 
      showGraphView(); 
     }else{ 
      showDataView(); 
     } 
     if(graphView != null) graphView.setGraphWidth(width); 
    } 

每次方向改變時,我將內容視圖從一個切換到另一個。在你的情況下,你可能只需要invalidate當前的根視圖,看看它是否會正確重繪。

這就是爲什麼你要平臺照顧它,所以你不要處理這個廢話。您最好使用onSaveInstanceState來保存您所需的特定數據,然後檢查onCreate中的數據,然後使用它。有關這方面的信息,請參閱http://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges

+0

好吧,我在哪裏放置代碼?在我的活動之前onCreate? – 2011-05-06 17:09:50

+0

@Femi這是隻有真正的答案,我發現最好是強制屏幕方向並保持這種狀態,特別是如果它是任何類型的藝術資產沉重的應用程序,這就是爲什麼大多數市場上的遊戲強制定位並且不允許它改變 – SRM 2011-05-06 17:10:53

+0

我在「景觀佈局」和「肖像佈局」區域放什麼? – 2011-05-06 17:11:42

10

使用android:configChanges="orientation"的解決方案將不起作用,除非應用程序的API級別爲12或更低。

在API級別13或更高版本中,屏幕大小在方向更改時發生更改,因此仍會導致活動在方向更改時被銷燬和啓動。

只需添加「屏幕尺寸」屬性,像我一樣如下:

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

現在,當你改變方向(和屏幕尺寸的變化),活動保持其狀態和onConfigurationChanged()被調用。當方向發生變化時,這將保持屏幕上的任何內容(即:Web視圖中的網頁)。

從該網站了解到這一點:http://developer.android.com/guide/topics/manifest/activity-element.html

此外,這顯然是一個壞的做法,讓閱讀下面關於處理運行時更改鏈接:

http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

正是我需要:)乾杯 – wayzz 2015-03-26 14:06:08

+0

嗨!我爲縱向和橫向模式使用不同的佈局,所以我不能使用'android:configChanges',還有其他解決方案嗎? – 2015-06-11 19:30:23

0

什麼爲我工作正在申報之一類變量是靜態的。 事實證明,靜態類變量初始化應用程序正在加載一次,但當應用程序正在重新加載,這些將不會再次初始化。

這些變量可以包含您不想重新初始化的狀態或對象。 我不能說這不是超優雅,但測試和爲我工作。

相關問題