Андроид. TabActivity, переключение между вкладками без уничтожения активности из tabHost

Я создал приложение, которое использует TabActivity. Все нормально до одного момента...

Каждый раз, когда вкладка переключается, действия из tabHost уничтожаются и создаются заново. Я зарегистрировал каждое состояние Activity и обнаружил, что когда вкладка сфокусирована, они называются methosd: onCreatr(), onStart(), onResume(), а когда вкладка не в фокусе, называются onStop(), onDestroy().

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

Извините за мой английский :)

Основной.Класс

package my.pack;

import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TabHost;

public class Main extends TabActivity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        TabHost tabHost = getTabHost();
        TabHost.TabSpec spect;
        Intent intent;

        intent = new Intent().setClass(this, ListDevice.class);
        spect = tabHost.newTabSpec("test").setIndicator("Device").setContent(intent);
        tabHost.addTab(spect);

        intent = new Intent().setClass(this, ListServer.class);
        spect = tabHost.newTabSpec("test").setIndicator("Server").setContent(intent);
        tabHost.addTab(spect);

        tabHost.setCurrentTab(0);
    }
}

ListServer.class (используется в tabHost)

package my.pack;

import java.io.File;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;

public class ListServer extends ListActivity {

    private File file = new File(".");
    private ArrayList<File> values = new ArrayList<File>();
    private CopyOfMyPerformanceArrayAdapter adapter;

    public void onCreate(Bundle icicle) {
        Log.d("test","server");
        super.onCreate(icicle);
        for (File f: file.listFiles()) {
            if (f.isDirectory()) values.add(f);
        }
        for (File f: file.listFiles()) {
            if (f.isFile()) values.add(f);
        }

        View footer = getLayoutInflater().inflate(R.layout.footer, null);
        getListView().addFooterView(footer);

        adapter = new CopyOfMyPerformanceArrayAdapter(this,values);
        setListAdapter(adapter);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        try{
        File file = (File) getListAdapter().getItem(position);

        if (file.isDirectory()) {
            adapter.clear();
            for (File f: file.listFiles()) {
                values.add(f);
            }
        adapter.notifyDataSetChanged();
        }} catch(Exception e) { Log.d("opa", "server");}

    }


    public void onRestart(){
        Log.d("ftp","onRestart");
        super.onRestart();
    }
    public void onStart(){
        Log.d("ftp","onStart");
        super.onStart();
    }
    public void onResume(){
        Log.d("ftp","onResume");
        super.onResume();
    }
    public void onPouse(){
        Log.d("ftp","onpouse");
        super.onPause();
    }
    public void onStop(){
        Log.d("ftp","onStop");
        super.onStop();
    }
    public void onDestroy(){
        Log.d("ftp","onDestroy");
        super.onDestroy();
    }
}

person Slava    schedule 13.05.2012    source источник
comment
Режим запуска ListDevice и ListService?   -  person Changwei Yao    schedule 13.05.2012
comment
В проекте APIDemo есть пример TabHost. вы можете следить за ним.   -  person Changwei Yao    schedule 13.05.2012


Ответы (4)


Вместо этого вы можете использовать фрагменты для создания вкладок, как описано здесь Однако пример, показанный там, также уничтожает содержимое вкладки (т.е. фрагмент) при его замене (в onTabChanged()). К счастью, вы можете изменить это поведение. Если вы заметили, что в примере используются FragmentTransaction.add() и FragmentTransaction.remove(), вы можете изменить их на FragmentTransaction.show() и FragmentTransaction.hide(). Таким образом, ваша активность фрагмента не уничтожается при переключении вне поля зрения.

person D-Dᴙum    schedule 13.05.2012

используйте разные ключи для каждой спецификации вкладки,

заменить... это

spect = tabHost.newTabSpec("test")
spect = tabHost.newTabSpec("test")

с участием

spect = tabHost.newTabSpec("test1")
spect = tabHost.newTabSpec("test2")

эта работа для меня..

person yasir    schedule 17.12.2013

Ваши вкладки имеют один и тот же тег - "тест". Просто укажите разные теги и все должно быть ок.

person Eugene Chumak    schedule 14.06.2012
comment
У меня та же проблема, но у меня другие теги, поэтому я не думаю, что это проблема. - person Ben Clayton; 02.07.2013

Я думаю, что moveTaskToBack onDestroy должен работать.

person Magakahn    schedule 11.07.2012