【发布时间】:2011-08-03 00:43:01
【问题描述】:
如何在 android 的 Activity 之间传递自定义对象?我知道捆绑包,但我似乎在其中看不到任何功能。谁能给我一个很好的例子吗?
【问题讨论】:
如何在 android 的 Activity 之间传递自定义对象?我知道捆绑包,但我似乎在其中看不到任何功能。谁能给我一个很好的例子吗?
【问题讨论】:
在活动之间传递对象或使对象对所有应用程序通用的一种简单方法是创建一个扩展应用程序的类。
这是一个例子:
public class DadosComuns extends Application{
private String nomeUsuario="";
public String getNomeUsuario() {
return nomeUsuario;
}
public void setNomeUsuario(String str) {
nomeUsuario = str;
}
}
在所有其他活动中,您只需实例化一个对象“DadosComuns”,声明为全局变量。
private DadosComuns dadosComuns;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//dados comuns
dadosComuns = ((DadosComuns)getApplicationContext());
dadosComuns.setNomeUsuario("userNameTest"); }
您实例化的所有其他活动 dadosComuns = ((DadosComuns)getApplicationContext()); 您可以访问 getNomeUsuario() == "userNameTest"
在你的 AndroidManifest.xml 你需要有
<application
android:name=".DadosComuns"
【讨论】:
你应该实现Parcelable interface。
链接到documentation。
【讨论】:
使用 Parcelable 接口,您可以将自定义 java 对象传递给 Intent。
1) 为您的类实现 Parcelable 接口,例如:
class Employee implements Parcelable
{
}
2) 将 Parcelable 对象传递到 Intent 中,例如:
Employee mEmployee =new Employee();
Intent mIntent = new Intent(mContect,Abc.class);
mIntent.putExtra("employee", mEmployee);
startActivity(mIntent);
3) 将数据放入新的 [Abc] Activity 中,例如:
Intent mIntent = getIntent();
Employee mEmployee = (Employee )mIntent.getParcelableExtra("employee");
【讨论】:
Parcel 可能会解决您的问题。
将Parcel 视为原始类型(long、String、Double、int 等)的“数组”(隐喻)。 如果您的自定义类由仅原始类型组成,则更改您的类声明,包括implements Parcelable。
你可以毫无困难地通过一个意图传递一个可打包的对象(就像你发送一个原始类型的对象一样)。在这种情况下,我有一个名为 FarmData 的 parcelable 自定义类(由 longs、strings 和 doubles 组成),我通过 Intent 从一个活动传递到另一个活动。
FarmData farmData = new FarmData();
// code that populates farmData - etc etc etc
Intent intent00 = new Intent(getApplicationContext(), com.example.yourpackage.yourclass.class);
intent00.putExtra("farmData",farmData);
startActivity(intent00);
但检索它可能会很棘手。接收意图的活动将检查是否与意图一起发送了额外的捆绑包。
Bundle extras = getIntent().getExtras();
FarmData farmData = new FarmData();
Intent intentIncoming = getIntent();
if(extras != null) {
farmData = (FarmData) intentIncoming.getParcelableExtra("farmData");// OK
}
【讨论】:
给定一个在整个对象树中实现 Serializable 的对象 PasswordState,您可以将该对象传递给另一个活动,如下所示:
private void launchManagePassword() {
Intent i= new Intent(this, ManagePassword.class); // no param constructor
PasswordState outState= new PasswordState(lengthKey,timeExpire,isValidKey,timeoutType,"",model.getIsHashPassword());
Bundle b= new Bundle();
b.putSerializable("jalcomputing.confusetext.PasswordState", outState);
i.putExtras(b);
startActivityForResult(i,REQUEST_MANAGE_PASSWORD); // used for callback
}
【讨论】: