[Notas do Android] Use o Intent para passar parâmetros entre várias atividades

 

1. Transfira os dados para a próxima atividade

Anteriormente, quando apresentamos o Intent, dissemos que podemos usar o Intent para transferir dados entre diferentes componentes. O próximo artigo é registrar como usar o Intent para transferir dados simples entre diferentes atividades, transferir pacotes de dados, transferir objetos de valor e Retornar dados ao conhecimento da atividade anterior.

1. Passe dados simples

O método principal:
putExtra(String name,String value);
putExtra(String name,int value);
(putExtra () tem vários métodos sobrecarregados, que não estão listados aqui) O
primeiro parâmetro é a chave (ou seja, o nome dos dados a serem passados); o
segundo parâmetro são os dados a serem passados ​​(você pode use tipo String, tipo int, tipo duplo, etc.).
getIntent();
③O getStringExtra(String name);
getInExtra(String name);
parâmetro é a chave anterior, que é o nome dos dados a serem passados.

Ideia
① Use uma série de métodos putExtra () (vários métodos de sobrecarga) fornecidos por Intent para armazenar temporariamente os dados a serem transferidos no Intent.
Em MainActivity,

        case R.id.button1:
             intent = new Intent(MainActivity.this,Aty1.class);
             intent.putExtra("data_aty1","这是从MainActivity传入Aty1的数据:"+data);
             startActivity(intent);
             break;

②Na próxima atividade, use o método getStringExtra () fornecido por Intent para retirar os dados passados.
No método onCreate () de Aty1:

        tv_aty1 = (TextView)findViewById(R.id.textView_aty1);
        Intent intent = getIntent();
        String tempData = intent.getStringExtra("data_aty1");
        tv_aty1.setText(tempData);

Imagem do efeito:
 

2. Entregue pacotes de dados

Métodos principais:
① O Bundle();método de armazenamento de pacotes de dados no método:
putString(String name,String value); //存储字符串在Bundle包中
putInt(String name,int value); //存储整型数据在Bundle包中
etc. (tipo float, tipo duplo, etc. também estão disponíveis, não listados um por um)
② O putExtras(Bundle extras);
parâmetro extras é a instância do Pacote de pacote de dados
ou o
putExtra(String name,Bundle value);
nome é o nome do pacote de dados, o que é conveniente Passe para outras atividades e retire; o
valor é uma instância do pacote de pacote de dados.
③getIntent ();
④Intent é fornecido:
getExtras();um nome de método de
getBundleExtra(String name);método
é o nome do tipo de pacote de dados ②.
⑤ Retire os atributos específicos do pacote de dados:
getString(String name);
getInt(String name);etc.

Idéias:
① Integre uma série de dados (incluindo string, inteiro, booleano, etc.) no pacote Bundle (usando putString (), putInt (), etc.), use putExtras () ou putExtra () em Métodos de intenção são passados ​​para outras atividades.
Em MainActivity,

           case R.id.button2:
                intent = new Intent(MainActivity.this,Aty2.class);
                Bundle bundle = new Bundle();
                bundle.putString("name",data);
                bundle.putInt("age",18);
                intent.putExtras(bundle);
                startActivity(intent);
                break;

②Na próxima atividade, use o método getExtras () ou getBundleExtra () para passar o pacote Bundle e, em seguida, use o método getString () no Bundle para buscar os dados.
No método onCreate () de Aty2:

        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
        et_aty2.setText(String.format("姓名:%s     年龄:%d",bundle.getString("name"),bundle.getInt("age") ));

Imagem do efeito:
 

Se sexo não existir no pacote Bundle, ele pode ser escrito como

        et_aty2.setText(String.format("姓名:%s     年龄:%d    性别:%s",bundle.getString("name"),bundle.getInt("age"),bundle.getString("sex","女") ));

Imagem do efeito:
Escreva a descrição da imagem aqui

Se sexo existe no Pacote e é atribuído o valor "masculino", bundle.getString("sex","女") ));o que acontecerá se os dados ainda estiverem escritos como "masculino" ? Você pode experimentar.

3. Passe objeto de valor

Objeto de valor: objeto personalizado com tipo de dados.
Existem duas interfaces de objeto serializado que podem ser usadas para transferir objetos de valor:
java.io.Serializable
②A seguir android.os.Parcelable
, apresentaremos como essas duas interfaces transferem objetos de valor.

(1) Interface de serialização serializável

Esta é a interface embutida da linguagem Java para serializar objetos. Você só precisa implementar Serializable, e o resto do sistema irá lidar com isso automaticamente, então a eficiência será relativamente baixa.
①Crie uma nova classe java—— User.java( implrments Serialiable)

import java.io.Serializable;

public class User implements Serializable{

    private String name;
    private int age;

    //两个参数的构造方法
    public User(String name,int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return name;
    }

    public int getInt(){
        return age;
    }
}

② Use o putExtra()método para salvar os dados em Usuário em MainActivity

           case R.id.button3:
                intent = new Intent(MainActivity.this,Aty3.class);
                User user = new User(data,19);
                intent.putExtra("user",user);
                startActivity(intent);
                break;

③ Use o getSerialiableExtra()método para buscar os dados no Aty3

        Intent intent = getIntent();
        User user = (User)intent.getSerializableExtra("user");
        tv_aty3.setText(String.format("名字:%s     年龄:%d",user.getName(),user.getInt()));

Imagem do efeito:
 

(2) Interface de serialização parcelável

Esta é uma interface fornecida pela plataforma Android para serializar objetos. Usar essa interface requer a reescrita de uma série de métodos relacionados a dados, portanto, a eficiência é maior do que a interface serializável.
①Crie uma nova classe java—— User2.java( implrments Parcelable)

import android.os.Parcel;
import android.os.Parcelable;

public class User2 implements Parcelable {

    private String name;
    private int age;

    //两个参数的构造方法
    public User2(String name,int age){
        this.name = name;
        this.age = age;
    }

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }
}

②Se você apenas escrever desta forma, o sistema reportará um erro.
Escreva a descrição da imagem aqui
③Assim, temos que reescrever alguns métodos. Neste momento, o sistema dará um lembrete:
Escreva a descrição da imagem aqui
Portanto, precisamos reescrever o describeContents()método e o writeToParcel()método
a). describeContents()Este método só precisa para ser reescrito, então não se preocupe com isso por enquanto.

@Override
    public int describeContents() {
        return 0;
    }

b). writeToParcel()Precisamos gravar dados no Parcel de destino neste método, porque a interface Parcelable não possui um mecanismo de serialização totalmente automático, portanto, precisamos escrevê-lo manualmente.

@Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(getName());
        parcel.writeInt(getAge());
    }

④ Além disso, também precisamos reescrever os métodos a seguir para ler os dados.

public static final Creator<User2> CREATOR = new Creator<User2>() {
        @Override
        public User2 createFromParcel(Parcel in) {
            return new User2(in.readString(),in.readInt());
        }

        @Override
        public User2[] newArray(int size) {
            return new User2[size];
        }
    };

⑤ Finalmente, chamamos o getParcelableExtra()método em Aty4 para receber os dados.

Intent intent = getIntent();
        User2 user2 = intent.getParcelableExtra("user2");
        tv_aty4.setText(String.format("姓名:%s     年龄:%d ",user2.getName(),user2.getAge()));

Imagem do efeito:
 

Observação: não entendi profundamente esses dois métodos de interface. Acabei de registrar meu entendimento. Se houver um erro, você pode espalhar um pouco. O mais importante é apontar o entendimento incorreto.

2. Retorne os dados para a atividade anterior

Anteriormente, falamos sobre como passar dados para a próxima atividade e, em seguida, sobre como retornar dados para a atividade anterior.
Métodos relacionados:
①Este startActivityForResult(Intent intent,int requestCode);
método startActivity()é o mesmo que o método, que também é usado para iniciar a atividade, mas espera retornar um resultado para a atividade anterior quando a atividade for destruída.
Parâmetro 1 ou Intento; o
parâmetro 2 é o código de solicitação, usado para determinar a origem dos dados no retorno de chamada subsequente.
setResult(int resultCode,Intent data);
Este método é usado especificamente para retornar dados à atividade anterior.
O parâmetro 1 é usado para retornar o resultado do processamento para a atividade anterior. Geralmente, apenas os dois valores de RESULT_OK ou RESULT_CANCELED são usados; o
parâmetro 2 é para retornar o Intent com dados.

① Em MainActivity, chame o startActivityForResult()método para iniciar Aty5.

                case R.id.button5:
                intent = new Intent(MainActivity.this,Aty5.class);
                startActivityForResult(intent,1);
                break;

②Registre um botão no Aty5, adicione lógica para retornar dados no evento de clique e retornar à página principal.

                Intent intent = new Intent();
                String data = et_aty5.getText().toString();
                intent.putExtra("data_aty5",data);
                setResult(RESULT_OK,intent);
                finish();

startActivityForResult()③Uma vez que usamos o método para iniciar Aty5, o onActivityResult()método da atividade anterior será chamado de volta depois que Aty5 for destruído , portanto, precisamos reescrever esse método em MainActivity para obter os dados de retorno.

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 1:
                if(resultCode == RESULT_OK){
                    String str = data.getStringExtra("data_aty5");
                    tv_atymain.setText(str);
                }
                break;
            default:
                break;
        }
    }

Imagem do efeito:
 

Também podemos reescrever o onBackPressed()método em Aty5 para retornar os dados após pressionar a tecla Voltar. Você pode tentar isso sozinho

Acho que você gosta

Origin blog.csdn.net/az44yao/article/details/112638273
Recomendado
Clasificación