Передача ArrayList <String>между вкладками - PullRequest
2 голосов
/ 05 июня 2010

Мне не очень понятен объект Intent и как его использовать для передачи данных между Activity. В моем приложении у меня есть несколько вкладок, между которыми я хочу передать 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 из намерения, которое должно быть пропущено при запуске действия. Но как это сделать?

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

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

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

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

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

On TabOne.java:

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

On TabTwo.java:

arrayPeople =  myTabs.arrayPeople

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

2 голосов
/ 17 апреля 2011

В приведенных выше примерах я действительно работал, когда я заменял «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);
}
0 голосов
/ 05 июня 2010

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

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

...