Как сохранить намерение для второго занятия? - PullRequest
1 голос
/ 02 апреля 2019

У меня есть MainActivity с некоторыми картами, которые имеют разные имена. onClick, заголовок передается как intent через adapter в secondActivity и отображается как заголовок. Оттуда я могу пойти на другие мероприятия. Если я вернусь из одного из этих других действий (с помощью кнопки «Назад», созданной путем установления второго действия в качестве родительского действия), заголовок исчезнет. Как мне сохранить заголовок, который изначально был передан как намерение, или я должен сделать это совершенно иначе?

Я пытался использовать onResume() и onStart() в secondActivity для переназначения намерения из глобальной переменной.

Класс adapter, в котором написан метод карты onClick:

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

secondActivity, где должен отображаться заголовок:

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

РЕШЕНИЕ: Решением было поместить android: launchMode = "singleTop" в файл манифеста для второй активности. Более подробно это описано здесь: Как правильно вернуться к родительскому занятию?

Ответы [ 5 ]

2 голосов
/ 02 апреля 2019

Чтобы сделать это, вы должны переопределить onSavedInstanceState в своей SecondActivity.Вы можете использовать что-то подобное, приспособить его к вашим потребностям:

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

Дайте мне знать, если это сработало!удачи

1 голос
/ 02 апреля 2019

Если вы хотите сохранить данные в первом действии между вызовами метода lifecicle, вы должны сохранить свои данные в объекте Bundle.Переопределить метод onSaveInstanceState (Bundle bundle) вашей активности:

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

, а также переопределить метод Activity onRestoreInstanceState (BundlevedInstanceState):

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

      setYourHeaderMethodExample(variableData2)
  }
1 голос
/ 02 апреля 2019

удалить header.setText(name); из onResume и onStart методов

0 голосов
/ 02 апреля 2019

В методе onCreate вашего второго действия добавьте:

getSupportActionBar().setHomeButtonEnabled(true);

и переопределите метод onOptionsItemSelected () в классе и добавьте следующий код:

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

Вам не нужнопереопределить методы onStart () и onResume ().

0 голосов
/ 02 апреля 2019

При возврате из третьего действия во второе действие выполняется вызов метода onStart () и onResume ().Попробуйте не использовать onStart () и onResume () для установки заголовка и используйте метод onCreate для установки заголовка.

Метод onCreate () выполняется только один раз за время своего существования, но onStart () и onResume () будут выполняться всякий раз, когда действие появляется на экране.Поэтому, возвращаясь с третьего занятия, мы не имеем никаких значений в намерении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...