2013-02-14 70 views
0

我是新來的Android,我正在構建一個簡單的應用程序開始。它由一個有三個屏幕的客戶端組成。在第一個屏幕中,用戶被提示輸入一個IP連接到服務器(我使用EditText和一個按鈕)。如果連接成功建立,將從服務器檢索一些數據,客戶端將在黑屏上顯示數據(我使用TextView)。這將是第二個屏幕。然後,用戶可以向服務器詢問有關從服務器檢索到的任何數據的詳細信息,這將是第三個屏幕(我再次使用TextView)。我應該使用幾個屏幕的應用程序的幾個活動?

問題是我不知道最好的辦法是什麼。我目前有一個活動和一個XML文件,其中包含視圖的所有組件(EditText,按鈕,TextView)。到目前爲止,我一直在使用setVisibility(View.GONE);來隱藏某些組件,具體取決於用戶所在的屏幕(例如,在第一個屏幕中,我必須隱藏兩個TextView)。

我面臨的一個問題是,當我將手機放在水平位置時,隱藏的組件再次出現。我不知道隱藏視圖是否是爲我的目的而做的理想事情。

我以爲也許我應該使用多個活動,不是嗎?

我真的很感激任何幫助,你可以給我構建我的第一個應用程序。

+0

再次出現您的組件的問題是您需要在設備轉動時保持活動狀態。方向更改將導致Activity被銷燬並重新創建,因此您需要利用onSaveInstance狀態來記住哪些視圖是可見的,哪些不是,然後在onCreate中再次設置可見性。 – 323go 2013-02-14 14:07:37

+0

@ 323go當許多其他小部件屬性是 - 如果分配了ID,爲什麼不能自動存儲可見性屬性? – 2013-02-14 14:10:30

+0

@ 323go好吧,你是對的;能見度不會自動保存。 – 2013-02-14 14:19:27

回答

1

我肯定會推薦將你的應用分成多個Activities/Fragments。取決於每個屏幕的邏輯有多大,你會很高興你以後做了,因爲每個活動只有一個責任。

看看你的郵件應用程序爲例。你有你的列表活動顯示你所有的郵件,然後當你選擇一個時,它開始顯示你的郵件內容的詳細活動。每個活動只負責讓每個活動更容易編寫和維護的一件事。

它還簡化了佈局定義,因爲每個只包含相關部分。

+0

謝謝,我想使用多個活動,但我遇到了在活動中「傳遞套接字」的問題。第一個活動應該創建套接字,然後將它傳遞給其他活動,我只知道如何使用'intent.putExtra(String name,String value)'傳遞一個字符串'但不是套接字 – user2071976 2013-02-14 14:36:02

+0

您可以在您的應用程序中創建一個靜態變量應用程序對象,然後第二個活動可以訪問它。只有當用戶返回到應用程序時,您才需要確保套接字仍然有效,因爲應用程序可能已被銷燬,系統將恢復您的第二個活動。 – user2055996 2013-02-14 15:34:45

-1

設置按鈕能見度GONE(按鈕將被徹底「刪除」 - 按鍵空間將可用於其他部件)或INVISIBLE(按鈕,便會成爲「透明」 - 它的空間將不能用於其他部件) :代替

setVisibility(View.GONE) 

變化

setVisibility(View.INVISIBLE) and try 
+0

負面評論請注意.... – NagarjunaReddy 2013-02-14 14:19:04

+1

我沒有downvote,但我的猜測是,你得到了downvote,因爲你的回答並不真正回答海報的問題。在他旋轉設備之前,他沒有可視性方面的問題。 – 323go 2013-02-14 14:28:43

1

使用看起來這是COMI很多。當配置改變時,Android銷燬並重新創建並且Activity。屏幕旋轉是方向的一部分。爲了避免這種情況,該活動負責維持狀態。給出的機制是onCreateonSaveInstanceState。在你的榜樣,你可以做類似如下:

int uiPhase = 1; 

@Override 
void onCreate(Bundle data) { 
    uiPhase = data.getInt("uiPhase", 1); 
    // inflate layout 
    setPhase(uiPhase); 
} 

// invoke the following each time your screen changes 
void setPhase(int newPhase) { 
    uiPhase = newPhase; 
    switch(uiPhase) { 
     case 1: // show UI elements for first screen, hide others 
      break; 
     case 2: // show UI elements for second screen, hide others 
      break; 
     case 3: // show UI elements for third screen, hide others 
      break; 
    }  
} 

@Override 
void onSaveInstanceState(Bundle data) { 
    data.put("uiPhase", uiPhase); 
} 

我不想圖案複雜以上太多,但是設置知名度的好方法如下:

phase1view.setVisibility(uiPhase == 1 ? View.VISIBLE : View.GONE); 
phase2view.setVisibility(uiPhase == 2 ? View.VISIBLE : View.GONE); 
phase3view.setVisibility(uiPhase == 3 ? View.VISIBLE : View.GONE); 

這拉動了setPhase方法中的重複。

+0

謝謝,我會試試看它是如何工作的 – user2071976 2013-02-14 14:42:01

相關問題