Сохранить значения в поле для ввода

Подскажите, как можно сохранять значения (цифры) введённые пользователем в EditText в Активити №1 и при этом иметь возможность использовать их в Активити №2?

Цифры из Активити №1 будут использоваться в формуле. И они должны быть доступны изменению.

Переход на Активити №2 происходит по нажатию кнопки.


Ответы (2 шт):

Автор решения: igo

тут есть несколько вариантов:

1) передача в Intente

  ...
  etLName = (EditText) findViewById(R.id.etLName);
}

public void onClick(View v) {
  Intent intent = new Intent(this, ViewActivity.class); 
  intent.putExtra("fname", etFName.getText().toString());  
  startActivity(intent);  //запускаем активити с данными 
} 

извлекаем данные во второй активности

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.view);

  Intent intent = getIntent();
  String fName = intent.getStringExtra("fname"); // извлекаем данные в переименую
}

2) либо можно создать static переменную и обращаться к ней через имя активити напрямую из другой активити

int num = MainActivity.num;  // static int num; в mineActivity
→ Ссылка
Автор решения: V.March

Я использовал оба из приведенных ниже вариантов. Но каких либо предпочтений у меня нет.

1) Вариант с передачей и возвратом данных через startActivityForResult():

Первый класс:

public class FirstActivity extends AppCompatActivity implements View.OnClickListener {
    private static final int MY_REQUEST_CODE = 123456;

    private Button btnOpenCalculator;
    private EditText myEditText;

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

        myEditText = findViewById(R.id.my_edit_text);
        btnOpenCalculator = findViewById(R.id.button_calc);
        btnOpenCalculator.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Intent intent = new Intent(this, SecondActivity.class);
        // отправляете тут Ваше число с требованием вернуть обратно какой-то ответ.
        intent.putExtra("firstData", Long.parseLong(myEditText.getText().toString()));
        startActivityForResult(intent, MY_REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK && requestCode == MY_REQUEST_CODE && data != null) {
            //если все ок и данные не пустые, то можно их засетить их в EditText
            String myResult = data.getStringExtra("myResult");
            myEditText.setText(myResult);
        }
    }
}

Второй класс:

public class SecondActivity extends AppCompatActivity implements View.OnClickListener {

    private Button buttonSendResultBack;
    private long firstData = 0;
    private long resultOfCalculation = 0;

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

        //Получаем данные(число) с первой активити и записываем в переменную firstData.
        Intent intent = new Intent();
        firstData = intent.getLongExtra("firstData", 0);

        //Далее делаете то, что вам нужно с даннымии и записываете в переменную resultOfCalculation.

        //Ниже написал вариант с кнопкой, при нажатии которой 
        // будут отправляться данные с переменной resultOfCalculation 
        // обратно в первую активити.

        buttonSendResultBack = findViewById(R.id.button_send_back);
        buttonSendResultBack.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {

        //Передаете результат обратно в первую активити.
        Intent intent = new Intent();
        intent.putExtra("myResult", resultOfCalculation);
        setResult(RESULT_OK, intent);

        finish();
    }
}

2) Вариант с EventBus:

Импорт библитотеки:

implementation 'org.greenrobot:eventbus:3.1.1'

Создаете класс (название любое) который будет “посредником”. С полем, например, long:

public class NewDataEvent {

    public final long messageDraftID;

    public NewDataEvent(long messageDraftID) {

        this.messageDraftID = messageDraftID;

    }
}

Так отправляете число из первого активити во второе:

long resultOfCalculation = 123456789; //Для примера.
EventBus.getDefault().post(new NewDataEvent(resultOfCalculation));

*Во втором активити(которое ждет результат) нужно подписаться на события(!):

Импорт:*

import org.greenrobot.eventbus.EventBus;

Подписка, инициализация и отписка:

@Override
public void onResume() {
    super.onResume();

    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this);
    }
}

@Subscribe
public void onEvent(UpdateDraftListEvent event) {
    //Получение числа которое отправили из первого активити или фрагмента:
    long myResult = event.messageDraftID; //здесь ждем отправленное 123456789.

}

Вариант для отписки во Фрагментах:

//Я использовал `eventBus` обычно во фрагментах, потому отписывался в `onDetach()`.

@Override
public void onDetach() {

    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().unregister(this);
    }
    super.onDetach();
}

Вариант для отписки в Активити:

@Override
protected void onDestroy() {

    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().unregister(this);
    }
    super.onDestroy();
}
→ Ссылка