2014-11-13 52 views
0

從一個活動傳遞到另一個數據,你需要把這些數據用在包和意圖傳遞之間的靜態對象:參考多項活動,而不是使用束每次

Bundle bundle = new Bundle(); 
bundle.putString(「key」, 「MyDataString」); 
Intent a = new Intent(Sender.this, Receiver.class); 
a.putExtra(bundle); 
startActivity(a); 

然而,說我有3個活動。這些活動中的每一個都需要訪問相同的集合對象:一組照片。

活動1需要在列表視圖中,以顯示照片

活動2只需要在一個完全不同的佈局來顯示這些照片

活動3只需要顯示一些照片,但也可以動態替換哪些正在顯示

因此:所有3個活動需要共享相同的數據對象。

我是否需要不斷將對象作爲每個活動之間的包進行傳遞,或者有沒有辦法讓它只有1個實例,並且所有3個類都共享它?

+0

我編輯了我的答案,使其與您的問題更相關。 – Janpan

回答

0

你可以創建自己的類,稱之爲會話。

然後實現它像這樣:

* -------------------------- 
* Description 
* -------------------------- 
* This class is used to store variables only until the app is completely closed. 
* -------------------------- 
* 
*/ 
public class Session 
{ 
    //Variables of current instance of app. 
    public static String var1  = "1234"; 
    public static ArrayList<String> photos = new ArrayList<String>(); 
} 

然後在其他的活動,只需直接調用這些變量,就像這樣:

String temp = Session.var1; 

或將它們

Session.var1 = "New Value"; 

for (String temp : Session.photos) 
{ 
    String photoURI = temp; 
    //and so on ... 
} 

我一直都這樣做......而且,您不希望將您的整個應用程序數據放在這裏,但它在某些情況下可以爲您節省一些時間。

+0

不,不要這樣做。一個'Activity'不應該公開'public static'變量或方法 - 這對於Android來說是一個非常糟糕的設計原則。 – Squonk

+0

您不必將此作爲活動進行擴展。我改變了它。我真的不明白爲什麼它是如此糟糕,取決於你想使用它。 – Janpan

+1

我可以100%看到這是如何工作的,我曾考慮過這個。我會更多地考慮這個方法。在另一種語言(比如obj-c)中,我將擁有一個主控制器對象,它將負責在控制器之間傳遞該對象(控制器不需要直接與對方進行通信以獲取他們需要的信息)。由於Android似乎並沒有乾淨地允許「主活動」,我正試圖弄清楚在活動之間傳遞數據的一種乾淨方式,而不是冗餘。你的解決方案是有效的,但對我而言仍然不理想。 – Aggressor

0

事實上,你必須有一個abstractActivity(可以說BaseActivity),然後讓所有其他Activity的擴展這個BaseActivity。您可以在abstract活動中使用通用變量和常用功能(例如:用於創建AlertDialogs,ProgressDialogs,使用Intents等開始活動)。這種方式少用於相同功能的代碼。由於您的所有活動都是該父活動類的子類,因此它們都可以訪問BaseActivity中定義的變量。

請參見android how to create my own Activity and extend it?的示例。從同一個問題的答案摘自:

public abstract class BaseActivity extends Activity { 
    String commonVariable; 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(getLayoutResourceId()); 
     commonVariable = "Hello"; 
    } 

    protected abstract int getLayoutResourceId(); 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // do extra stuff on your resources, using findViewById on your layout_for_activity1 
     Log.d("TAG", "Hey I can access the common variable. Its: "+commonVariable); 
    } 

    @Override 
    protected int getLayoutResourceId() { 
     return R.layout.layout_for_activity1; 
    } 
} 

如果你只是有一個共同的變量,你可以明顯地繼續前進,使一個class並定義static變量存在,如@Janpan已建議。然而,這是一個設計選擇,根據你的情況,你會想在未來隨着項目的發展,對你有什麼好處。

+3

但是這不會在沒有可能存在的情況下強加關係嗎?爲什麼所有這些類都必須從基類繼承,當他們所需要的只是對一個通用靜態對象的引用? – Aggressor

+0

你是對的。我想它是一個選擇的問題。這是一個可以考慮的替代設計。在短期內,是的,人們可以通過'static'變量創建一個'Class',並像@Janpan所說的那樣使用它。但從長遠來看,這對我來說似乎更清潔,因爲可能有許多共同的功能,例如。用於顯示'AlertDialogs','ProgressDialogs',使用'Intents'開始的活動等等,這些活動通常被大多數活動所使用。他不必在每次活動中一次又一次地定義它們,而只需定義一次。所以代碼的複製較少。 –

相關問題