2014-02-12 4 views
1

Это мой первый вопрос с Android lifecycleand я чувствую себя немного беспомощным:Как передать и манипулировать объектами между деятельностью с использованием намерений

В деятельности есть OnCreate. Это место, где я создаю ArrayList под названием playerNames и ArrayList называется ходов. Также есть еще кое-что, что происходит в oncreate. В onStart A я создаю флаг, поэтому я знаю, какая функция выполняется в случае, если я хотел бы закрыть все сразу. В onDestroy флаг возвращается к нулевому значению.

В конце концов я сделать намерение получить в операцию B где я беру перемещает список вместе. Работает отлично.

Теперь я хотел бы сделать намерение от B, чтобы вернуться к A. Что происходит на жизненном цикле, когда я пытаюсь это сделать? Очевидно, onCreate of A вызывается и приводит к ошибке NullPointerException, возвращающему список playerNames.

Я хотел бы сохранить этот ArrayList во время работы B и вернуть его, когда вернусь к A. Какой метод является правильным (onResume? OnRestart?) И как его сохранить? Мне действительно нужны SharedPreferences?

Заранее спасибо за вашу любезную помощь

+0

Прежде всего, вы не должны быть так много на 'onCreate()'. – m0skit0

+2

Рассмотрите возможность чтения http://developer.android.com/training/basics/intents/result.html, более конкретно метода startActivityForResult. Должен служить вашим потребностям – pedromss

+0

Почему B снова запускает A? Если вы запуститеActivityForResult(), и A получит уведомление о завершении B, и вы сможете делать все, что вам нужно, в onActivityResult() в A – natez0r

ответ

0

На активность А:

-Создание намерению, с указанием Wich активности вы хотите начать

-Положите данные о таком намерении быть получены деятельности В.

-Начало активность для результата.

-On onActivityResult() убедитесь, что у вас есть данные, чтобы получать и делать с ними то, что вы хотите.

На активности B:

-onCreate() получать данные от активности А;

-Модифицируйте данные по вашему желанию;

-Создание нового намерения;

-Задать данные в намерении;

-Установить результаты деятельности и данные о намерениях.

-finish активность B

Ниже приведен пример из шагов, которые я описываю, что она делает это есть задание А начать активность B, и передавая ей пустой ArrayList. Затем в Activity B массивList заполняется и отправляется обратно в Activity A, где содержимое списка элементов массива отображается на экране.

Код:

активность A:

private static final int REQUEST_LIST = 1; 
ArrayList<String> myList; 
TextView listText; 

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

    listText = (TextView) findViewById(R.id.mylist_text); 
    myList = new ArrayList<String>(); 

    Intent i = new Intent(MainActivity.this, ActivityB.class); 
    i.putExtra(ActivityB.EXTRA_ARRAY, myList); 
    startActivityForResult(i, REQUEST_LIST); 

} 

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

    if (resultCode != Activity.RESULT_OK) return; 

    if (requestCode == REQUEST_LIST) { 
     myList = (ArrayList<String>) data.getSerializableExtra(ActivityB.EXTRA_ARRAY); 

     StringBuilder text = new StringBuilder(); 
     for (int j = 0; j < myList.size(); j++) { 
      text.append(myList.get(j) + " "); 
     } 

     listText.setText(text.toString()); 
    } 
} 

Activty B:

public static final String EXTRA_ARRAY = "com.example.androidtest.mainactivity.array"; 

ArrayList<String> myList; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activityb_layout); 
    myList = (ArrayList<String>) getIntent().getSerializableExtra(EXTRA_ARRAY); 

    for (int i = 0; i < 10; i++) { 
     myList.add(String.valueOf(i)); 
    } 

    Intent data = new Intent(); 
    data.putExtra(EXTRA_ARRAY, myList); 
    setResult(Activity.RESULT_OK, data); 

    finish(); 
} 

Внимание: Вы не можете забыть объявить активность B в файле манифеста , Также обратите внимание на то, как действия знают, какие данные следует отправлять и собирать с помощью констант, созданных в классах, которые должны быть последовательными, поэтому избегайте использования литералов и используйте определенные константы.

+0

Это потрясающе, спасибо вам большое. Помогает мне реорганизовать часть моего кода – Steph

0

С активностью B вы можете вернуться к предыдущему Экземпляру с помощью:

Intent intent = new Intent(this, A.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent); 

Это очистит все текущий стек и вернуться назад к Экземпляру (http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP). Пока ваша активность не будет уничтожена, у вас будут все данные.

В любом случае вам следует рассмотреть возможность использования состояния экземпляра Activity (http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState%28android.os.Bundle%29).

Смежные вопросы