Jana L
Jana L

Reputation: 11

How to keep intent for second activity?

I have a MainActivity with some cards which have different names. onClick, the title is passed as an intent via the adapter to the secondActivity and displayed as the header. From there, I can go to other activities. If I come back from one of these other activities (via the back button created by establishing second activity as the parent activity) the header is gone. How do I keep the header that was originally passed on as an intent or should I go about this completely different?

I have tried using onResume() and onStart() in the secondActivity to reassign the intent from a global variable.

The adapter class, where the card onClick method is written:

@Override
public void onBindViewHolder(final TripHolder tripHolder, final int position) {
    Trip trip = trips.get(position);
    tripHolder.setDetails(trip);

    tripHolder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, SecondActivity.class);
            TextView card_title = v.findViewById(R.id.TripNamecl);
            intent.putExtra("card_title", card_title.getText().toString());
            context.startActivity(intent);
        }
    });
}

The secondActivity where the header should be displayed:

public class SecondActivity extends AppCompatActivity {
    String name;
    TextView header;
    static final String STATE_HEADER = "header";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        name = getIntent().getStringExtra("card_title");
        header = findViewById(R.id.TripsHeader);
        header.setText(name);
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putString(STATE_HEADER, name);
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        name = savedInstanceState.getString(STATE_HEADER);
        header.setText(name);
    }

    public void launchMapsActivity(View view) {
        Uri gmmIntentUri = Uri.parse("geo:48.8566°,2.3522");
        Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
        mapIntent.setPackage("com.google.android.apps.maps");
        if (mapIntent.resolveActivity(getPackageManager()) != null) {
            startActivity(mapIntent);
        }
    }

    public void launchTravelActivity(View view) {
        Intent intent = new Intent(this, TravelActivity.class);
        startActivity(intent);
    }

    public void launchPlansActivity(View view) {
        Intent intent = new Intent(this, PlansActivity.class);
        startActivity(intent);
    }
}

SOLUTION: The solution was to put android:launchMode="singleTop" into the manifest file for the secondactivity. It's described in more detail here: How can I return to a parent activity correctly?

Upvotes: 1

Views: 343

Answers (5)

gurleen kaur
gurleen kaur

Reputation: 1

In your second activity's onCreate method add:

getSupportActionBar().setHomeButtonEnabled(true);

and override the onOptionsItemSelected() method in the class and add the following code:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

You don't need to override the onStart() and onResume() methods.

Upvotes: 0

Samsad CV
Samsad CV

Reputation: 125

When coming back from third activity to second activity onStart() and onResume() method call executes. Try not using onStart() and onResume() for setting the header and use onCreate method for setting the header.

onCreate() method executes only once in its lifetime, but onStart() and onResume() will execute whenever the activity comes to screen. So when coming back from third activity we don't have any values in the intent.

Upvotes: 0

Anton Prokopov
Anton Prokopov

Reputation: 641

If you want to save data in first activity between lifecicle method calls you have to save your data in Bundle object. Override method onSaveInstanceState(Bundle bundle) of your activity:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("AStringKey", variableData);
    outState.putString("AStringKey2", variableData2);
 }

And also override Activity method onRestoreInstanceState(Bundle savedInstanceState):

  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState){
      super.onRestoreInstanceState(savedInstanceState);
      variableData = savedInstanceState.getInt("AStringKey");
      variableData2 = savedInstanceState.getString("AStringKey2");

      setYourHeaderMethodExample(variableData2)
  }

Upvotes: 1

remove header.setText(name); from onResume and onStart methods

Upvotes: 1

Pier Giorgio Misley
Pier Giorgio Misley

Reputation: 5351

In order to do it you should override onSavedInstanceState in your SecondActivity. You can use something like that, obv adapt it to your needs:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);

    //here you can save your variables
    savedInstanceState.putString("myHeader", name);
}

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //here you can retrieve your variables
    name = savedInstanceState.getString("myHeader");
}

Let me know if this worked! good luck

Upvotes: 2

Related Questions