Передача ArrayList‹String› между вкладками

Я не очень понимаю объект Intent и то, как его использовать для передачи данных между действиями. В моем приложении у меня есть несколько вкладок, между которыми я хочу передать ArrayList. Вот пример кода, который я планирую использовать, но мне не хватает той части, где основное действие перехватывает намерение и передает его новому действию при запуске:

1. myTabs.java ==> Думаю, здесь мне нужно добавить некоторый код для передачи данных между TabOne и TabTwo. На данный момент он просто использует пример кода примера TabActivity.

public class myTabs extends TabActivity {
    /** Called when the activity is first created. */
    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Reusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, TabPeopleActivity.class);
        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("TabOne").setIndicator("TabOne",
                          res.getDrawable(R.drawable.ic_tab_one))
                      .setContent(intent);
        tabHost.addTab(spec);

        // Do the same for the other tabs
        intent = new Intent().setClass(this, TabTransactionActivity.class);
        spec = tabHost.newTabSpec("TabTwo").setIndicator("TabTwo",
                          res.getDrawable(R.drawable.ic_tab_two))
                      .setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(0);
    }
}

2. TabOne.java ==> Я добавил фрагмент кода в процедуру onStop, чтобы заполнить данные Intent массивом, который я хочу передать в TabTwo. Хотя не уверен, что это правильный способ.

public class TabOne extends Activity {

    [...]
    private ArrayList<String> arrayPeople;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.tabone);
        arrayPeople = new ArrayList<String>();

    [... here we modify arrayPeople ...]

    }

    /** Called when the activity looses focus **/
    @Override
    public void onStop(){
        Intent myIntent = new Intent();
        myIntent.putStringArrayListExtra("arrayPeople", arrayPeople);
        this.setIntent(myIntent);
    }
}

3. TabTwo.java ==> Здесь я пытаюсь получить ArrayList из Intent, который должен быть передан при запуске Activity. Но как это сделать?

public class TabTwo extends Activity {

    private ArrayList<String> arrayPeople;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.transaction);

        Intent myIntent = new Intent();
        myIntent = this.getIntent();
        arrayPeople = myIntent.getStringArrayListExtra("arrayPeople");
    }
}

Спасибо за ваши идеи!

ИЗМЕНИТЬ:

Хорошо, я сделаю это простым, вот полное рабочее пространство проекта:

http://www.lecompteestbon.com/Android.LCEB.zip

Что я хочу сделать, так это офлайн-версию веб-сайта lecompteestbon, которая позволяет людям вести учет между друзьями после выходных.

TabPeople = Add the list of friends
TabTransactions = List of expenses
TabTransaction = Add an expense
TabResult = Calculate the list of payments

Дайте мне знать, как заставить это работать :)


person Christophe    schedule 05.06.2010    source источник


Ответы (3)


Как насчет установки статического поля в объект myTabs?

    public class myTabs extends TabActivity {
....
public static arrayPeople = new ArrayList<String>();
....

На TabOne.java:

 @Override
    public void onStop(){
       myTabs.arrayPeople = arrayPeople;
    }

На TabTwo.java:

arrayPeople =  myTabs.arrayPeople

Имеет ли смысл?

person Francesco Laurita    schedule 05.06.2010
comment
Это выглядит просто и интересно, но выдает (Приостановлено (исключение RuntimeException)) при попытке изучить содержимое. Я получаю только [ПЕЧАТЬ] : System.out.println(arrayPeople [ПЕЧАТЬ]); System.out.println(arrayPeople 1=[ + arrayPeople.get(0) + ]); System.out.println(arrayPeople [ПЕЧАТЬ ОК]); Что-нибудь я делаю неправильно? - person Christophe; 06.06.2010
comment
Вы должны опубликовать свой код. Отредактируйте свой вопрос и добавьте новый фрагмент кода :) - person Francesco Laurita; 06.06.2010
comment
Хорошо, посмотрите детали, которые я добавил, с полным рабочим пространством для загрузки. - person Christophe; 03.07.2010

В приведенных выше примерах это действительно сработало, когда я заменил «onStop» = «onPause»

/** Called when the activity looses focus **/
@Override public void onStop()
{
    Intent myIntent = new Intent();
    myIntent.putStringArrayListExtra("arrayPeople", arrayPeople);
    this.setIntent(myIntent);
}

/** Called when the activity looses focus **/
@Override public void onPause()
{
    Intent myIntent = new Intent();
    myIntent.putStringArrayListExtra("arrayPeople", arrayPeople);
    this.setIntent(myIntent);
}
person tony    schedule 17.04.2011

Я не думаю, что изменение намерения в onStop() будет работать, потому что TabHost обрабатывает намерения. Установка намерения одного класса с помощью this.setIntent() не позволит другому классу получить к нему доступ с помощью getIntent(), поскольку они основаны на разных намерениях.

Я бы либо сохранил свой arrayPeople в базе данных, либо передал бы arrayPeople обратно в TabHost с помощью MyTabs.setArrayPeople или чего-то подобного. Затем вы можете запросить базу данных onCreate вашей следующей вкладки или просто вытащить ее из класса MyTabs.

person m6tt    schedule 05.06.2010
comment
Использование базы данных кажется слишком сложным для этой простой вещи. Когда вы имеете в виду использование MyTabs.setArrayPeople, похоже ли это решение на предложенное выше? - person Christophe; 06.06.2010
comment
Да, лучше всего использовать статический ArrayList. - person m6tt; 06.06.2010