在活动之间传递自定义对象?

时间:2011-04-11 12:17:55

标签: java android

如何在android中的活动之间传递自定义对象?我知道捆绑包但我似乎无法在其中看到任何功能。有人能告诉我一个很好的例子吗?

5 个答案:

答案 0 :(得分:15)

您应该实施Parcelable interface

链接到documentation

答案 1 :(得分:5)

使用Parcelable接口,您可以将自定义java对象传递给intent。

1)为你的类实现Parcelable接口,如:

class Employee implements Parcelable
{
}

2)将Parcelable对象传递给意图:

Employee mEmployee =new Employee();
Intent mIntent = new Intent(mContect,Abc.class);
mIntent.putExtra("employee", mEmployee);
startActivity(mIntent);

3)将数据输入新的[Abc]活动,如:

Intent mIntent  = getIntent();
Employee mEmployee  = (Employee )mIntent.getParcelableExtra("employee");

答案 2 :(得分:1)

Parcel可能会解决您的问题。

Parcel视为原始类型(long,String,Double,int等)的“数组”(隐喻)。 如果您的自定义类仅由原始类型组成,则更改您的类声明,包括implements Parcelable

你可以毫无困难地通过一个意图传递一个可分辨的对象(就像你发送一个原始类型的对象一样)。在这种情况下,我有一个名为 FarmData parcelable自定义类(由long,字符串和双精度组成),我通过意图从一个活动传递到另一个活动。

    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
    }

答案 3 :(得分:0)

给定一个在整个对象树中实现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
}

答案 4 :(得分:0)

在活动之间传递对象或使对象适用于所有应用的一种简单方法是创建一个扩展Application的类。

这里是一个例子:

bash-3.2$ echo $conf_path ; cat $conf_path
config.txt
ERROR: MESSAGE: \[Library not found \!\]
ERROR: MESSAGE: \[File not found \!\]
ERROR: MESSAGE: \[Path not found \!\]
ERROR: MESSAGE: \[Permission denied \!\]
bash-3.2$ 
bash-3.2$ echo $log_path; cat $log_path
log.txt
INFO: MESSAGE: Script Starts
INFO: MESSAGE: Some command output
ERROR: MESSAGE: [Library not found !]
INFO: MESSAGE: Some other command output
ERROR: MESSAGE: [Path not found !]
INFO: MESSAGE: Exit script with 2
bash-3.2$ 
bash-3.2$ while read -r line; do if grep -q "${line}" $log_path; then  echo "Found line: $line" >> $out_log; else echo "Line not found: $line" >> $out_log; fi; done < $conf_path
bash-3.2$ 
bash-3.2$ echo $out_log; cat $out_log
output_log.txt
Found line: ERROR: MESSAGE: \[Library not found \!\]
Line not found: ERROR: MESSAGE: \[File not found \!\]
Found line: ERROR: MESSAGE: \[Path not found \!\]
Line not found: ERROR: MESSAGE: \[Permission denied \!\]
bash-3.2$ 

在所有其他活动中,您只需实例化一个对象“ DadosComuns”,并声明为全局变量。

public class DadosComuns extends Application{

    private String nomeUsuario="";

    public String getNomeUsuario() {
        return nomeUsuario;
    }

    public void setNomeUsuario(String str) {
        nomeUsuario = str;
    }
}

您实例化的所有其他活动 dadosComuns =((DadosComuns)getApplicationContext()); 您可以访问 getNomeUsuario()==“ userNameTest”

在您的 AndroidManifest.xml 中,您需要

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"); }