Извлекает значение разделяемого объекта из второго действия в MainActivity, которое вызывает второе

#android #android-intent #parcelable

#Android #android-намерение #разделяемый

Вопрос:

У меня есть класс, который реализует разделяемый класс. Из основного действия я передаю разделяемый объект. Во втором действии я извлекаю объект и использую объект для изменения данных. Все в порядке. Но проблема в том, что мне нужно извлечь эти изменения из второго действия в основное действие. Я не знаю, как я мог это сделать.

Здесь вызов в основном действии:

 public class MainActivity extends Activity {
Tgestion Tges= new Tgestion();
Button buttonI,buttonM,buttonB,buttonD,buttonS; 

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    addListenerOnButton();
}

public void addListenerOnButton() {

    final Context context = this;

    buttonI = (Button) findViewById(R.id.buttonIntroducir);

    buttonI.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) { 
            Intent intent = new Intent(context, IntroducirPatron.class);
            intent.putExtra("com.example.sistemacontrasena.gestion", Tges);
            startActivity(intent);               

        }

    });
}
}
  

Tges — это объект, который реализует класс parcelable.
Во втором действии:

 public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_introducir_patron);

    // --- Obtenemos objeto Parcelable desde el Intent
    this.gestion=getIntent().getParcelableExtra("com.example.sistemacontrasena.gestion");

}
  

После этого я установил некоторые изменения, например this.gestion.setSecret(значение);
Когда я закрываю это второе действие, в основном действии я не знаю, как я могу получить this.gestion.getSecret() со значением, которое я ввел, например. Как я могу это сделать?

Класс parcelable является:

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


public class Tgestion implements Parcelable{

private String[] secret;


public Tgestion(){

    this.secret=new String[2];

}


/**
 * Constructor Tgestion para parcel.
 * @param source
 */
private Tgestion(Parcel source) {
    this.secret=new String[2];
    readFromParcel(source);

}

public void setSecret(String[] s){

    for (int i=0;i<this.secret.length;i  ){

        this.secret[i]=s[i];

    }

}

public String[] getSecret(){

    return this.secret;
}   

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}

@Override
public void writeToParcel(Parcel destino, int flags) {
    // TODO Auto-generated method stub
    destino.writeStringArray(this.secret);
}

private void readFromParcel(Parcel in){

    in.readStringArray(this.secret);
}


public static final Parcelable.Creator<Tgestion> CREATOR = new Parcelable.Creator<Tgestion>() {

    @Override
    public Tgestion createFromParcel(Parcel source) {
        return new Tgestion(source);
    }

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

}
  

Ответ №1:

Вы не можете просто изменить Parcelable и ожидать, что первое действие увидит эти изменения. Пакеты сериализуются и десериализуются, что означает, что у вас есть новая копия.

Вы должны использовать startActivityForResult() , setResult() (во втором действии) и onActivityResult() (в первом) для возврата данных.

См. Получение результата от действия в документах.