Какое событие использовать, вернувшись к предыдущей деятельности, которая еще не закончена? [Дубликат]

У меня есть специальный случай для этой проблемы.

В моем проекте все идет хорошо, он может скомпилироваться и успешно скомпилироваться, но в моей среде Android Studio IDE (и я также пробовал Intelligent IDEA, они в той же ситуации), файл R.java может не должны быть хорошо решены и всегда должны быть красными.

Точно так же:

Это почти сошло с ума, я не могу вынести цвет чтения, когда я программирую.

Наконец-то я обнаружил, что эта сложная проблема возникает из-за моего размера файла R.java. Мой проект очень большой, он поддерживает множество многоязычных и многоэкранных размеров. Существует так много ресурсов, что размер моего файла R.java составляет около 2.5M.

Максимальный размер файла в Android Studio составляет 2,5 М в настройках по умолчанию, поэтому файлы, превышающие этот предел, не могут быть хорошо решены. И вы можете изменить настройки по умолчанию в «AndroidStudio-root / bin / idea.properties».

изменить эту строку:

idea.max.intellisense.filesize=2500

на:

idea.max.intellisense.filesize=5000

Затем перезапустите студию Android, красный цвет уволен, я могу запрограммировать еще раз.

816
задан Jonik 27 April 2017 в 13:34
поделиться

9 ответов

Из вашего FirstActivity вызова SecondActivity с помощью метода startActivityForResult()

Например:

Intent i = new Intent(this, SecondActivity.class);
startActivityForResult(i, 1);

В вашем SecondActivity установите данные, которые вы хотите вернитесь к FirstActivity. Если вы не хотите возвращаться назад, не устанавливайте никаких параметров.

Например: В SecondActivity, если вы хотите отправить обратно данные:

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

t хотите вернуть данные:

Intent returnIntent = new Intent();
setResult(Activity.RESULT_CANCELED, returnIntent);
finish();

Теперь в вашем классе FirstActivity напишите следующий код для метода onActivityResult().

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

    if (requestCode == 1) {
        if(resultCode == Activity.RESULT_OK){
            String result=data.getStringExtra("result");
        }
        if (resultCode == Activity.RESULT_CANCELED) {
            //Write your code if there's no result
        }
    }
}//onActivityResult
2084
ответ дан Panda 18 August 2018 в 18:47
поделиться
  • 1
    @ismail Предположим, что в SecondActivity произошло какое-то исключение, в этом случае вам также нужно вернуть результат в FirstActivity, чтобы вы могли установить результат как "RESULT_CANCELLED" в блоке catch и вернуться к FirstActivty и в FirstActivity's' 'onActivityResult() вы можете проверить, получили ли вы результат успеха или неудачи. – Nishant 31 October 2013 в 06:42
  • 2
    Так что это зависит от вас, если вам не нужно знать причину отмены, вы можете использовать только setResult (RESULT_CANCELED); без каких-либо намерений – ismail 31 October 2013 в 12:43
  • 3
    @Lei Leyba No finish () не вызывается после вызова startActivityForResult (). First Actvity перейдет в состояние паузы. – Nishant 1 October 2014 в 07:26
  • 4
    Для меня это не работает. Это то, о чем я очень сильно ненавижу Android - эта система настолько ненадежна: - / – Martin Pfeffer 9 March 2015 в 22:51
  • 5
    Нет ничего «ненадежного». когда вы просто не понимаете это простое объяснение кода – AlexioVay 13 April 2017 в 11:03

Сначала вы используете startActivityForResult() с параметрами в первом Activity, и если вы хотите отправить данные с второго Activity на первый Activity, то передайте значение с помощью Intent с помощью метода setResult() и получите эти данные внутри onActivityResult() в первом Activity.

2
ответ дан Catalina 18 August 2018 в 18:47
поделиться

Ответ автора @Nishant верен. В моем случае onActivityResult никогда не вызывался из-за настроек в AndroidManifest. Убедитесь, что ваше второе действие (или отправитель) не установило эту строку в манифесте Android.

<activity android:name=".SecondViewActivity"
            android:parentActivityName=".FirstActivity"/>

Если это так, удалите android:parentActivityName=".FirstActivity"

-2
ответ дан Catluc 18 August 2018 в 18:47
поделиться

Для тех, у кого проблема с неправильным кодом запроса в onActivityResult

Если вы вызываете startActivityForResult() из вашего Fragment, код запроса изменяется с помощью Activity, который владеет Fragment.

Если вы хотите получить правильный результатCode в своей деятельности, попробуйте это:

Изменить:

startActivityForResult(intent, 1); To:

getActivity().startActivityForResult(intent, 1);

9
ответ дан Community 18 August 2018 в 18:47
поделиться

Если вы хотите обновить пользовательский интерфейс с результатом деятельности, вы не сможете использовать this.runOnUiThread(new Runnable() {}. При этом пользовательский интерфейс не будет обновляться с новым значением. Вместо этого вы можете сделать это:

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

    if (resultCode == RESULT_CANCELED) {
        return;
    }

    global_lat = data.getDoubleExtra("LATITUDE", 0);
    global_lng = data.getDoubleExtra("LONGITUDE", 0);
    new_latlng = true;
}

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

    if(new_latlng)
    {
        PhysicalTagProperties.this.setLocation(global_lat, global_lng);
        new_latlng=false;
    }
}

Это кажется глупым, но работает очень хорошо.

9
ответ дан DaviF 18 August 2018 в 18:47
поделиться

Дополняя ответ от @ Nishant, лучший способ вернуть результат активности:

Intent returnIntent = getIntent();
returnIntent.putExtra("result",result);
setResult(RESULT_OK,returnIntent);
finish();

У меня возникла проблема с

new Intent();

. Тогда я узнал, что правильный способ использует

getIntent();

для получения текущего намерения

30
ответ дан Julian Alberto Piovesan Ruiz D 18 August 2018 в 18:47
поделиться
  • 1
    Чуть немного странно создавать новый Intent, который существует только для хранения Bundle и не имеет нормальных значений, таких как действие или компонент. Но это также немного странно (и потенциально опасно?), Чтобы изменить Intent, который использовался для запуска текущей активности. Поэтому я искал источник для самого Android и обнаружил, что он всегда создает новый Intent для использования в качестве результата. Например, github.com/aosp-mirror/platform_frameworks_base/blob/… – spaaarky21 29 June 2018 в 16:52
  • 2
    Привет, spaaarky21, спасибо за ваш комментарий. Мне жаль, что я не был настолько ясен, объясняя, как именно я оказался в этом решении. Это было три года назад, и я могу только помнить, что мое приложение рушилось из-за «нового намерения», вот что я имел в виду, когда я сказал «у меня возникла проблема с». На самом деле я просто попробовал «getIntent», потому что это имело смысл в то время, и это сработало! Из-за этого я решил поделиться своим решением. Возможно, не лучший выбор слов, чтобы сказать «лучший способ». или «правильный путь», но я поддерживаю свое решение. Это то, что решило мою проблему и, очевидно, других людей. благодаря – Julian Alberto Piovesan Ruiz D 29 June 2018 в 18:29
  • 3
    И я на самом деле не изменяю намерение, которое использовалось для запуска текущего действия, я просто добавляю дополнительный вызванный «результат». – Julian Alberto Piovesan Ruiz D 29 June 2018 в 18:32

Как проверить результат из основного действия?

Вам нужно переопределить Activity.onActivityResult() , а затем проверить его параметры:

  • requestCode определяет, какое приложение вернуло эти результаты. Это определяется вами, когда вы вызываете startActivityForResult().
  • resultCode сообщает вам, удалось ли это приложение, не удалось или что-то другое
  • data содержит любую информацию, возвращаемую этим приложение. Это может быть null.
41
ответ дан Peter Mortensen 18 August 2018 в 18:47
поделиться
  • 1
    Это означает, что requestCode используется только в первом действии и никогда не используется для второго действия? Если у 2-го действия разные подходы, он изменился бы, но основывался бы на намерениях, а не на requestCode, правильно? Изменить: Да, stackoverflow.com/questions/5104269/… – JCarlos 11 August 2017 в 23:32

Очень распространенная проблема в android. Она может быть разбита на 3 части. 1) Запустите Activity B (происходит в действии A). 2) Установите запрошенные данные (происходит в активности B). 3) Получите запрошенные данные (происходит в действии A)

1) startActivity B

Intent i = new Intent(A.this, B.class);
startActivity(i);

2) Установить запрошенные данные

В этой части вы решить, хотите ли вы отправить данные назад или нет, когда происходит конкретное событие. Например: В операции B есть EditText и две кнопки b1, b2. Нажатие на кнопку b1 возвращает данные обратно в actvity. A Щелчок по кнопке b2 не отправляет никаких данных.

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

b1......clickListener
{
   Intent resultIntent = new Intent();
   resultIntent.putExtra("Your_key","Your_value");
   setResult(RES_CODE_A,resultIntent);
   finish();
}

Не отправлять данные

b2......clickListener
    {
       setResult(RES_CODE_B,new Intent());
       finish();
    }

пользователь нажимает кнопку возврата По умолчанию результат устанавливается с кодом ответа Activity.RESULT_CANCEL

]

3) Результат Retrive

Для этого переопределить метод onActivityResult

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

if (resultCode == RES_CODE_A) {

     // b1 was clicked 
   String x = data.getStringExtra("RES_CODE_A");

}
else if(resultCode == RES_CODE_B){

   // b2 was clicked

}
else{
   // back button clicked 
}
}
0
ответ дан Rohit Singh 18 August 2018 в 18:47
поделиться

Пример

Чтобы увидеть весь процесс в контексте, вот дополнительный ответ. Более подробно см. мой более полный ответ .

enter image description here [/g3]

MainActivity.java

public class MainActivity extends AppCompatActivity {

    // Add a different request code for every activity you are starting from here
    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) { // Activity.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.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();
    }
}
23
ответ дан Van 18 August 2018 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: