У меня проблема. У меня их 2 activities
, основной и второй экран. Я хочу, чтобы второй экран отправлял данные на главный экран, но когда я запускаю приложение, оно сообщает мне, что оно остановлено и закрывается. Когда делаю наоборот (С главной страницы на 2-й экран) работает без проблем.
Кто-нибудь знает, почему ошибка? Для передачи данных, которые я использую Bundle
, это правильный способ или есть лучший?
Главный экран :
public class MainActivity extends AppCompatActivity {
TextView tv2;
Button b2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv2=(TextView)findViewById(R.id.tv2);
b2=(Button)findViewById(R.id.b2);
Bundle parametros = this.getIntent().getExtras();
String datos = parametros.getString("datos");
tv2.setText(datos);
}
public void segunda_pantalla(View view){
Intent i=new Intent(this, segunda_pantalla.class);
startActivity(i);
}
Второй экран :
public class pantalla2 extends AppCompatActivity {
Button b1;
TextView tv1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pantalla2);
b1=(Button)findViewById(R.id.b1);
tv1=(TextView)findViewById(R.id.tv1);
}
public void b1(View view){
tv1.setText("1");
String datos = tv1.getText().toString();
Bundle parmetros = new Bundle();
parmetros.putString("datos", datos);
Intent i = new Intent(this, MainActivity.class);
i.putExtras(parmetros);
startActivity(i);
}
Как отправлять данные между Activity.
Для отправки данных это обычно делается через файл,
Bundle
в который могут быть добавлены значения, и которыйbundle
отправляется через файлIntent
. Вы можете указать доставку любого типа элемента или массива элементов, указав имя:Значения получаются в том
Activity
, который получаетBundle
с помощью getExtras() или определенного метода для получения полученного типа данных . Возвращает null, если значение не найдено.Или просто:
###* Важно: важно отметить, что получение информации в
Activity
пункте назначения всегда должно выполняться внутри методаonCreate()
.Ваша проблема возникает из-за того, что при запуске он
MainActivity
пытается получить пакет со значениемnull
, вы можете проверить это в файле LogCat.Выполните следующую проверку:
Примите во внимание, что в действии, которое вы не гарантируете, получает
Bundle
, вы должны выполнить эту проверку.Так же важно отметить, что для возврата к первому
Activity
не нужно делать это черезIntent
, просто используйтеfinish()
для его закрытия.Для отправки данных между действиями используется класс Bundle .
Этот метод можно использовать
putExtra()
для присоединения целых чисел, значений с плавающей запятой, байтов, символов и некоторых других типов данных, перечисленных в официальной документации для разработчиков Android. Для получения этих значений отIntent
приемникаActivity
используется Сервис илиBroadcast Receiver
методgetExtra()
.Точно так же мы можем хранить любое количество пар ключ-значение в объекте Bundle и просто передавать этот объект через
Intent
:Другие типы, которые могут быть отправлены:
Другие подобные вопросы на сайте, которые будут вам очень полезны:
Передача данных из фрагментов во фрагменты в другом действии
Помощь с различными действиями студии Android, получение данных
Это неправильный способ получения данных, есть метод
startActivityForResult()
:и вернуть данные из второго действия:
И приложение останавливается, потому что когда вы запускаете приложение в первый раз, оно запрашивает данные в
onCreate()
нем, но таких данных нет:Вот часть официальной документации по StartActivity() и StartActivityForResult().
Примечание . Функцию
finish()
следует использовать почти обязательно, иначе, когда вы войдете во второе действие, и оно вернет вас к первому, вы будете переключаться между действиями, это можно проверить, когда вы нажмете кнопку «Назад», вы вернетесь ко второму действию, затем к первому и в конце он выйдет из приложения.Любопытный факт: если вы просмотрите жизненный цикл активности , вы заметите, что при выполнении второй активности текущая активность помещается в,
onPause()
поэтому, когда вы возвращаетесь к основной активности, метод выполняетсяonResume()
вместоonCreate()
. (Несколько советов по оптимизации вашего кода)В первом действии вы должны проверить, что ваша переменная
paremetros
не равна нулюпопробуй что-нибудь вроде этого
Я бы сделал это следующим образом: Действие 2
И в MainActivity я его получаю
Готовы они у вас есть
получить от Window2
window2, которое отправляет вебтану1
А у тебя получается вот так: