Отправка данных обратно в главную активность на Android

У меня есть два вида деятельности: основная деятельность и детская активность.
Когда я нажимаю кнопку в основном действии, запускается дочерняя активность.

Теперь я хочу отправить некоторые данные обратно на главный экран. Я использовал класс Bundle, но он не работает. Он выдает некоторые исключения во время выполнения.

Есть ли какое-либо решение для этого?

Ответ 1

Есть несколько способов добиться того, чего вы хотите, в зависимости от обстоятельств.

Наиболее распространенный сценарий (как это звучит) - это когда дочерняя активность используется для ввода пользователя - например, для выбора контакта из списка или ввода данных в диалоговом окне. В этом случае вы должны использовать startActivityForResult для запуска своей дочерней операции.

Это обеспечивает конвейер для отправки данных обратно в основное действие, используя setResult. Метод setResult принимает значение результата int и Intent, которые передаются обратно вызывающему Activity.

Intent resultIntent = new Intent();
// TODO Add extras or a data URI to this intent as appropriate.
resultIntent.putExtra("some_key", "String data"); 
setResult(Activity.RESULT_OK, resultIntent);
finish();

Чтобы получить доступ к возвращенным данным в вызывающем переопределении активности onActivityResult. Код Request соответствует целому числу, переданному в вызове startActivityForResult, тогда как resultCode и Intent данных возвращаются из дочернего Activity.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    case (MY_CHILD_ACTIVITY) : {
      if (resultCode == Activity.RESULT_OK) {
        // TODO Extract the data returned from the child Activity.
        String returnValue = data.getStringExtra("some_key");
      }
      break;
    } 
  }
}

Ответ 2

Деятельность 1 использует startActivityForResult:

startActivityForResult(ActivityTwo, ActivityTwoRequestCode);

Активность 2 запущена, и вы можете выполнить операцию, чтобы закрыть Активность, сделайте следующее:

Intent output = new Intent();
output.putExtra(ActivityOne.Number1Code, num1);
output.putExtra(ActivityOne.Number2Code, num2);
setResult(RESULT_OK, output);
finish();

Упражнение 1 - возврат из предыдущего занятия вызовет onActivityResult:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == ActivityTwoRequestCode && resultCode == RESULT_OK && data != null) {
        num1 = data.getIntExtra(Number1Code);
        num2 = data.getIntExtra(Number2Code);
    }
}

ОБНОВЛЕНИЕ: Ответ на комментарий Seenu69, Во втором задании

int result = Integer.parse(EditText1.getText().toString()) 
           + Integer.parse(EditText2.getText().toString());
output.putExtra(ActivityOne.KEY_RESULT, result);

Затем в первом упражнении

int result = data.getExtra(KEY_RESULT);

Ответ 3

Отправка данных назад

Это помогает мне видеть вещи в контексте. Вот полный простой проект для отправки данных обратно. Вместо того, чтобы предоставлять файлы макета XML, здесь изображение.

enter image description here

Основная деятельность

  • Запустите второе действие с startActivityForResult, предоставив ему произвольный код результата.
  • Переопределить onActivityResult. Это называется, когда заканчивается второе задание. Вы можете убедиться, что это фактически Второе действие, проверив код запроса. (Это полезно, когда вы запускаете несколько разных действий из одного и того же основного действия.)
  • Извлеките данные, которые вы получили из возврата Intent. Данные извлекаются с использованием пары ключ-значение.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // Get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // Set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

Второе занятие

  • Поместите данные, которые вы хотите отправить обратно в предыдущее действие, в Intent. Данные хранятся в Intent с использованием пары ключ-значение.
  • Установите результат RESULT_OK и добавьте намерение, содержащее ваши данные.
  • Вызовите finish() чтобы закрыть второе действие.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // Get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // Put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

Другие заметки

  • Если вы находитесь во фрагменте, он не будет знать значение RESULT_OK. Просто используйте полное имя: Activity.RESULT_OK.

Смотрите также

Ответ 4

FirstActivity использует startActivityForResult:

Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, int resultCode); // suppose resultCode == 2

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 2)
    {
        String message=data.getStringExtra("MESSAGE");
    }
}

По вызову SecondActivity setResult() по событиям onClick или по onBackPressed()

Intent intent=new Intent();
intent.putExtra("MESSAGE",message);
setResult(2,intent);

Ответ 6

Я создал простой демонстрационный класс для вашего удобства.

FirstActivity.java

 public class FirstActivity extends AppCompatActivity {

    private static final String TAG = FirstActivity.class.getSimpleName();
    private static final int REQUEST_CODE = 101;
    private Button btnMoveToNextScreen;

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

        btnMoveToNextScreen = (Button) findViewById(R.id.btnMoveToNext);
        btnMoveToNextScreen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
                startActivityForResult(mIntent, REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK){
            if(requestCode == REQUEST_CODE && data !=null) {
                String strMessage = data.getStringExtra("keyName");
                Log.i(TAG, "onActivityResult: message >>" + strMessage);
            }
        }

    }
}

А вот и SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = SecondActivity.class.getSimpleName();
    private Button btnMoveToPrevious;
    private EditText editText;

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

        editText = (EditText) findViewById(R.id.editText);

        btnMoveToPrevious = (Button) findViewById(R.id.btnMoveToPrevious);
        btnMoveToPrevious.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String message = editText.getEditableText().toString();

                Intent mIntent = new Intent();
                mIntent.putExtra("keyName", message);
                setResult(RESULT_OK, mIntent);
                finish();

            }
        });

    }
}

Ответ 7

В первом упражнении вы можете отправить намерение с помощью startActivityForResult() а затем получить результат второго setResult после того, как оно закончилось с помощью setResult.

MainActivity.class

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_RESULT_CODE = 0;

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

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        // send intent for result 
        startActivityForResult(intent, SECOND_ACTIVITY_RESULT_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_RESULT_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra("keyName");

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

SecondActivity.class

public class SecondActivity extends AppCompatActivity {

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

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra("keyName", stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

Ответ 8

Используйте sharedPreferences и сохраните свои данные и получите доступ к ним из любого места приложения

сохранить дату, подобную этому

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();

И получим такие данные

SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    String savedPref = sharedPreferences.getString(key, "");
    mOutputView.setText(savedPref);

Ответ 9

Есть несколько способов сделать это. 1. используя startActivityForResult(), который очень хорошо объяснен в приведенных выше ответах.

  1. создав статические переменные в вашем классе "Utils" или любом другом вашем классе. Например, я хочу передать studentId из ActivityB в ActivityA. Сначала моя ActivityA вызывает ActivityB. Затем внутри ActivityB установите studentId (который является статическим полем в Utils.class). Подобно этому Utils.STUDENT_ID = "1234"; затем, возвращаясь к ActivityA, используйте studentId, который хранится в Utils.STUDENT_ID.

  2. создав метод getter и setter в вашем классе приложений.

вот так:

public class MyApplication extends Application {

    private static MyApplication instance = null;
    private String studentId="";

    public static MyApplication getInstance() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public void setStudentId(String studentID){
        this.studentId=studentID;
    }

    public String getStudentId(){
        return this.studentId;
    }
}

чтобы вы закончили. просто установите данные внутри, когда u находятся в ActivityB и после возврата к ActivityA, получите данные.

Ответ 10

Все эти ответы объясняют, что сценарий вашего второго действия должен быть завершен после отправки данных.

Но в случае, если вы не хотите завершать второе действие и хотите отправить данные обратно сначала, для этого вы можете использовать BroadCastReceiver.

Во втором занятии -

Intent intent = new Intent("data");
intent.putExtra("some_data", true);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

Во-первых Activity-

private BroadcastReceiver tempReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do some action
    }
};

Зарегистрировать получателя в onCreate() -

 LocalBroadcastManager.getInstance(this).registerReceiver(tempReceiver,new IntentFilter("data"));

Отмените регистрацию в onDestroy()

Ответ 11

Просто маленькая деталь, которая, я думаю, отсутствует в ответах выше.

Если ваша дочерняя активность может быть открыта из нескольких родительских действий, вы можете проверить, нужно ли вам делать setResult или нет, основываясь на том, была ли ваша активность открыта startActivity или startActivityForResult. Вы можете достичь этого с помощью getCallingActivity(). Больше информации здесь.