2015-06-30 66 views
0

在我的一個應用程序中,我有一種情況,用戶輸入頁面並顯示進度條,直到服務器返回響應。如果服務器返回錯誤或用戶沒有互聯網(或任何其他問題),則圖像視圖將顯示下面的錯誤消息。下面是我的問題:將帶有imageview和error msg的佈局放置在常規佈局xml中的佈局是否更好,該佈局是可見性=已消失的活動,然後在發生錯誤時使其可見,還是更好地製作單獨的layout.xml只是爲了錯誤,並做一個setcontentview,如果錯誤發生?如果我將setcontentview用於另一個佈局,那麼當新佈局膨脹時,用戶將看到白色閃光,而我不太喜歡這一點。另一方面,將錯誤佈局保留在常規佈局內可能會損失內存通常不會被普通用戶看到的東西。當然,還有第三種選擇 - 以編程方式添加錯誤屏幕 - 但是如果錯誤屏幕的佈局更加複雜,則會出現複雜問題。什麼是最有效的選擇?Android:實現錯誤屏幕

僞代碼如下:

<LinearLayout 
android:id="@+id/mainLayout" 
> 
.. layout code 

<LinearLayout 
android:id="@+id/errorLayout" 
android:visibility="gone" 
> 

</LinearLayout> 

</LinearLayout> 

編輯:我以前參與在某些情況下ViewStub的組合最終的解決方案(其中背景動作需要是不可見的,但我不希望在消耗內存可能不會顯示的東西)和DialogFragment(後臺活動需要透明顯示)。這個問題促使我認識的衆多android開發人員之間進行了激烈的離線辯論 - 其中一些人支持下面給出的活動答案,因爲它最好支持材料設計樣式,而其他人則支持使用對話框片段,因爲使用活動來實現類似這可能是矯枉過正的(額外的類,需要將其添加到清單,重複的工具欄邏輯等)。感謝所有貢獻的人。

第二次編輯:在處理完這個問題之後,我還沒有確定對話框片段解決方案。如果您在屏幕上顯示錯誤,並且您希望用戶認爲它是屏幕的有機部分,則頂部工具欄必須是可點擊的。一個dialogfragment離開頂部工具欄可見,但點擊它並沒有被註冊,因爲即使dialogfragment的尺寸沒有佔用整個屏幕,它仍然在片段管理器的「整個」屏幕上它自己的層中,並且竊取了所有點擊。我傾向於認爲真正做到這一點的唯一方法是使用viewstub。

+0

爲什麼你不能使用DialogFragment與您的錯誤信息? –

+0

查看我之前關於dialogfragment回答的對話 – Jon

回答

1

使用DialogFragment,它會出現在您的活動上並顯示錯誤。您可以爲片段設置自己的佈局,以及處理錯誤的代碼。不要嘗試在一個xml佈局中將可能顯示給用戶的每一個可能的東西編碼。

How to use Dialog Fragment? (showDialog deprecated) Android

編輯:添加一些鏈接,如果你想查找如何使dialogFragments全屏(即非浮動)。

Full Screen DialogFragment in Android

http://www.techrepublic.com/article/pro-tip-unravel-the-mystery-of-androids-full-screen-dialog-fragments/

+0

設計規範不允許我將錯誤顯示爲對話框片段 - 它必須出現而不是活動內容 – Jon

+1

如果您可以更具體一點,您的聲明對於是否需要錯誤的「設計規範」非常模糊「出現而不是活動內容」是指外觀或別的東西。 – NameSpace

+0

這是真的 - 我爲歧義道歉。如果我可以使用對話框片段或其他浮動元素,它將使整個情況變得更加容易 - 事實上,我已經在其他地方使用了該解決方案 - 但在這種情況下,這是不可能的。在任何情況下,非常感謝您的幫助 – Jon

1

我真的建議你啓動一個全新的Activity,因爲這是更好的做法,而且更清潔,而不是在一個Activity的背景中有很多隱形物品。您也真的不想調用setContentView()並將新佈局應用於您的原始Activity。您可以啓動新的Activity並通過意向附加個別錯誤信息:

Intent intent = new Intent(this, ErrorActivity.class); 
String errorMessage = "This is a custom error message."; 
intent.putExtra("errorMessage", errorMessage); 
startActivity(intent); 

然後ErrorActivity內就可以收到特定的錯誤信息,像這樣:

String errorMessage = getIntent().getExtras().getString("errorMessage"); 

那麼你將要展示它在的ErrorActivity的的onCreate()一TextView

TextView errorText = (TextView) findViewById(R.id.errorText); 
errorText.setText(errorMessage); 

希望這可以幫助,但隨時來查詢你有任何問題。

+0

這種方法的問題是,如果用戶沒有互聯網連接,並且我向他顯示了一個重試按鈕,那麼重試按鈕將重新啓動原始活動,並且我得到到兩個活動之間的乒乓球,直到用戶放棄或問題得到解決爲止 – Jon

+1

@Jon我確實看到了你的觀點,但在一天結束時,如果你的應用程序需要互聯網連接,那麼你可以做很多事情來幫助你用戶。我建議,如果您擔心這一點,請檢查用戶在重試按鈕的onClick()中是否有互聯網連接。如果你這樣做,那麼它不會乒乓,因爲它只會讓他們重試,如果他們連接到WiFi連接或移動網絡可用。 – edwoollard