Сохранить значения в поле для ввода
Подскажите, как можно сохранять значения (цифры) введённые пользователем в EditText в Активити №1 и при этом иметь возможность использовать их в Активити №2?
Цифры из Активити №1 будут использоваться в формуле. И они должны быть доступны изменению.
Переход на Активити №2 происходит по нажатию кнопки.
Ответы (2 шт):
тут есть несколько вариантов:
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
Я использовал оба из приведенных ниже вариантов. Но каких либо предпочтений у меня нет.
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();
}