2017-06-29 222 views
0

我開發了一個由多個活動組成的Android應用程序,我必須在它們之間傳遞ab對象,但是我無法通過使用意圖來傳遞它,因爲對象的類沒有實現可序列化,我該怎麼做? 我不能修改我的課 謝謝:)的源代碼在活動之間傳遞對象

public class MyClass { //stuff } 
//I can't modify this source code 
MyClass m = new MyClass(); //object I have to pass 
+0

類的使用對象究竟是此對象嗎?它的Java類是什麼? – CommonsWare

+1

它是一個MongoDBAndroidDriver類 –

+3

我的猜測是它應該是一個單例,直接或通過某種包裝。所以,你沒有把它傳遞出去,但所有的東西都可以引用它。無論如何,你沒有辦法在活動之間傳遞它,所以它不是要成爲一個單身人士,就是你將不得不堅持一項活動(例如,使用多個片段)。 – CommonsWare

回答

3

假設有一個名爲StudentDataObject有一些數據類型的數據對象類。

StudentDataObject studentDataObject = new StudentDataObject(); 
Gson gson = new Gson(); 
String studentDataObjectAsAString = gson.toJson(studentDataObject); 

現在我們使用intent將它從一個活動傳遞給另一個活動。

Intent intent = new Intent(FromActivity.this, ToActivity.class); 
intent.putExtra("MyStudentObjectAsString", studentDataObjectAsAString); 
startActivity(intent); 

現在我們處於新的活動中,我們在這裏使用下面一行來獲取該對象。

Gson gson = new Gson(); 
String studentDataObjectAsAString = getIntent().getStringExtra("MyStudentObjectAsString"); 
StudentDataObject studentDataObject = gson.fromJson(studentDataObjectAsAString, StudentDataObject.class); 

活動本身知道從哪裏我叫的,所以我們可以直接寫getIntent()方法。

在這裏我們只需要添加一個依賴GSON我們可以使用下面一行添加它的build.gradle文件。

compile 'com.google.code.gson:gson:2.6.2' 

還有一件事是實現StudentDataObjectParcelable如果顯示錯誤,則只需按ALT + ENTER和實現方法。 嘗試一次,希望它能工作。

爲StudentDataObject樣本實施例應該是這樣的: -

public class StudentDataObject implements Parcelable { 
     // fields 
     //empty constructor 
     //parameterised constructor 
     //getters and setters 
     //toString method 
     //last implement some Parcelable methods 
     } 
+0

謝謝,這就是我要做的 –

+0

@GCM歡迎,如果您對上述示例有疑問,請告訴我 –

0

此代碼可以幫助你:

public class EN implements Serializable { 
//... you don't need implement any methods when you implements Serializable 
} 

FirstActivity

EN enumb = new EN(); 
Intent intent = new Intent(getActivity(), NewActivity.class); 
intent.putExtra("en", enumb); //second param is Serializable 
startActivity(intent); 

SecandActivity

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
en = (EN)getIntent().getSerializableExtra("en"); //Obtaining data 
} 

Passing data through intent using Serializable

+1

我的類無法實現可串行化,它是一個編譯類,我無法修改源代碼 –

+0

在您的類中實現Serializable –

+0

//當您實現可序列化時,您不需要實現任何方法 –

0

您需要實現parcelable,然後通過intent傳遞它。不要使用Serializable原因比parcelable慢。

這裏瞭解如何讓你的對象parcelable:https://developer.android.com/reference/android/os/Parcelable.html

你不來以後,通過你的對象是這樣的:

intent.putExtra("KEY", your_object); 

來閱讀:

getIntent().getExtras().getParcelable("KEY"); 
+0

我不能修改我的類的源代碼,所以我不能實現Parcelable –

+0

如果你不能這樣做,那麼這是不可能的。如果你想要的話,你可以通過設置舊對象的值來創建一個新的可以對象,就像現有對象的克隆一樣,或者只傳遞重要的部分,比如id,name,description等。 –

2

首先創建Parcelable數據模型。

public class DataModel implements Parcelable { 
private int mData; 

public int describeContents() { 
    return 0; 
} 

public void writeToParcel(Parcel out, int flags) { 
    out.writeInt(mData); 
} 

public static final Parcelable.Creator<DataModel> CREATOR 
     = new Parcelable.Creator<DataModel>() { 
    public DataModel createFromParcel(Parcel in) { 
     return new DataModel(in); 
    } 

    public DataModel[] newArray(int size) { 
     return new DataModel[size]; 
    } 
}; 

private DataModel(Parcel in) { 
    mData = in.readInt(); 
} 

}

投放對象爲目的

intent.putExtra("KEY", object); 

獲取對象從意圖

object = getIntent().getExtras().getParcelable("KEY"); 
+0

DataModel是我必須通過的對象的類嗎? –

0

擴展類並實現在繼承的類序列化或parcelable和使用它的對象在其他的答案。

Class NewClass extends MyClass implements serializable { 
//Create a constructor matching super 
} 

這個類,而不是我的