Как посылать данные между activities?

У меня есть проблема. У меня есть 2 activities, главная и второй экран. Я хочу, чтобы 2-ой экран послал ему данные в главный экран, но когда я инициализирую приложение, он говорит мне, что он задержался, и закрывается. Когда я это делаю наоборот (С главной страницы до 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);
}
9
задан 28.10.2019, 23:26
2 ответа

Как посылание данных между Activities.

Чтобы реализовывать envió данных он осуществляется обычно посредством одного Bundle в котором могут присоединяться стоимость и этот bundle он послан через один Intent. Возможно определять envió любого типа элемента или array элемента определяя имя:

    intent.putExtra("usuario", "StackOverflow!");
    intent.putExtra("id", 123);
    intent.putExtra("myByte", 0xa);
    intent.putExtra("latitud", 0.12324234);
    startActivity(intent);      

Стоимость получается в Activity который он получает Bundle посредством getExtras () или специфический метод, чтобы получать тип полученной информации. Возвратись null, если он не находит стоимость.

String valor = getIntent().getExtras().getString("usuario");

или просто:

String valor = getIntent().getStringExtra("usuario");

Твоя проблема происходит, потому что после того, как инициализируется MainActivity попробуй получать bundle, у которого есть стоимость null, ты можешь проверять это в LogCat.

Caused by: java.lang. NullPointerException
at Маинактивити.онкреате (MainActivity.java)

Реализуй следующее утверждение:

 Bundle parametros = this.getIntent().getExtras();
 if(parametros !=null){
    String datos = parametros.getString("datos"); 
   tv2.setText(datos);
 } 

прими во внимание, что в активности, которую ты не гарантируешь, получил один Bundle, ты должен реализовывать это утверждение.

Кроме того важно комментировать, чем, чтобы возвращаться в нее первый Activity ты не нуждаешься в том, чтобы реализовать это посредством одного Intent, просто используй finish() чтобы закрывать ее.


Другие сходные вопросы в сайте, которые ты были бы большой помощи:

11
ответ дан 03.12.2019, 18:48
  • 1
    все твои аргументы стоились, однако, если ты обращаешь внимание, когда он возвращается в главную активность со второй, он это делает с startActivity (); что не является рекомендуемым. –  30.11.2016, 22:10
  • 2
    Говорится о том, чтобы посылать стоимость поэтому использование startActivity (), не о том, чтобы посылать и не о том, чтобы получать стоимость используя startActivityForResult (), , потому что не является рекомендуемым то, что я предлагаю в моем ответе? –  25.09.2018, 17:15

Это не правильный способ получать данные, существует так называемый метод startActivityForResult():

public void segunda_pantalla(View view){
    Intent i=new Intent(this, segunda_pantalla.class);
    startActivityForResult(i, 1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1) { // el "1" es el numero que pasaste como parametro
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("datos");
            // tu codigo para continuar procesando
            tv2.setText(datos);
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            // código si no hay resultado
        }
    }
}//onActivityResult

и чтобы возвращать данные со второй активности:

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

    Intent returnIntent = new Intent();
    returnIntent.putExtra("datos",datos);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();
}

И приложение задерживается, из-за которого, когда ты выполняешь app первый этот раз прося данные в onCreate() но не существуют такие данные:

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

Здесь немного официальной Документации StartActivity () и StartActivityForResult ()

Заметь функцию finish() нужно использовать почти обязательным способом, по-другому, когда ты войдешь во вторую активность, и я возвратил тебя, первую ты будешь ciclandote между активностью, это может тестироваться, когда ты нажимаешь на back button, он возвратит тебя во вторую активность, потом и в конце концов он выйдет у первой из приложения.

Любопытная информация: Если ты проверишь Жизненный цикл активности, ты поймешь, что, когда работает вторая активность, настоящая активность кладется в onPause() следовательно, когда ты возвращаешься в главную активность, работает метод onResume() вместо onCreate(). (Одинокий звук какие-то советы, чтобы оптимизировать твой код)

2
ответ дан 03.12.2019, 18:48
  • 1
    Говорится о том, чтобы посылать стоимость поэтому использование startActivity (), не о том, чтобы посылать и не о том, чтобы получать стоимость используя startActivityForResult (), он не необходим. –  25.09.2018, 17:16

В первой активности ты должен подтверждать, что твоя переменная paremetros не являлась недействительной

Bundle parametros = this.getIntent().getExtras();

Протестируй что-то asГ -

 Bundle parametros = this.getIntent().getExtras();
 if(parametros != null) {  
 String datos = parametros.getString("datos"); 
 tv2.setText(datos);}
2
ответ дан 03.12.2019, 18:48

Я бы это реализовал следующего способа Activity 2

Intent i = new Intent(this, MainActivity.class);
i.putExtras("datos", datos);
startActivity(i);

Y в MainActivity я это получаю

Intent recibir = getIntent();
String datos = recibir.getStringExtra("datos");

Заношу в список уже у тебя есть

1
ответ дан 03.12.2019, 18:48
  • 1
    это не решает проблему, которой он получает данные в onCreate, и когда главная активность выполнит сначала intent estará он опустошил – Rene Limon 30.11.2016, 20:48
  • 2
    правда не, если я он функционировал только, внесла идею о, как я бы это сделал, Спасибо за твои подсказки – Javier fr 30.11.2016, 20:54