2012-05-13 91 views
1

我創建了一個使用TabActivity的應用程序。一切都很好,直到有一刻...Android。 TabActivity,切換標籤而不會破壞tabHost的活動

每次切換標籤時,來自tabHost的活動都會被銷燬並重新創建。我記下了Activity的每一個狀態,並發現當tab被集中時被稱爲methosd:onCreatr(),onStart(),onResume(),並且當時tab不在焦點上被稱爲onStop(),onDestroy()

如何切換選項卡而不破壞並重新創建活動。 ???

對不起,我的英語:)

Main.Class

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(); 
    } 
} 
+0

ListDevice的啓動模式和ListService? –

+0

APIDemo項目中有一個TabHost示例。你可以關注它。 –

回答

1

你可能要考慮使用,而不是片段來創建所描述的選項卡here 但是,其中顯示的示例還會在交換時破壞選項卡內容(即片段)(在onTabChan GED())。幸運的是,你可以改變這種行爲。如果您發現該示例使用FragmentTransaction.add()和FragmentTransaction.remove(),但你可以改變這些以FragmentTransaction.show()FragmentTransaction.hide().這樣,當轉出的視圖

0

你的選項卡具有相同的片段的活性不被破壞標籤 - 「測試」。只需指定不同的標籤,一切都應該沒問題。

+0

我有同樣的問題,但我有不同的標籤,所以我不認爲這是問題。 –

0

我認爲onDestroy上的moveTaskToBack應該起作用。

1

使用differenct關鍵脫穎而出每個選項卡規格,

取代......這

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

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

這項工作對我來說..