2012-06-12 14 views
14

Pracuję z Androidem od jakiegoś czasu, ale fragmenty są dla mnie trochę nowe (tak jak większość ludzi prawdopodobnie). W każdym razie mam poniższy kod i działa dobrze. Mam trzy fragmenty, po jednym w każdej zakładce. Zastanawiam się, czy to normalne, że onCreateView jest wywoływany za każdym razem, gdy przełączam karty i czy ma to sens? Czy nie powinno być sposobu, aby NIE przerysowywać fragmentu za każdym razem, gdy zmienia się zakładka?Fragment oncreateview z Androidem wywołany zmianą tabulatora

Konwertuję to z aplikacji, która ma 3 czynności, po jednej na każdej karcie, i wydaje się, że jest to odpady do odtworzenia widoku za każdym razem, gdy karta się zmienia, kiedy było dobrze, mając widoki między zmiany karty ...

BTW, ten kod pożyczone od: http://thepseudocoder.wordpress.com/2011/10/04/android-tabs-the-fragment-way/

public class Tabs extends FragmentActivity implements 
    TabHost.OnTabChangeListener { 

final String MAP_TAB = "Map"; 
final String IMAGES_TAB = "Images"; 
final String SETTINGS_TAB = "Settings"; 

TabHost mTabHost; 
HashMap<String, TabInfo> mapTabInfo = new HashMap<String, TabInfo>(); 
TabInfo mLastTab = null; 

private class TabInfo { 
    private String tag; 
    private Class clss; 
    private Bundle args; 
    private Fragment fragment; 
    TabInfo(String tag, Class clazz, Bundle args) { 
     this.tag = tag; 
     this.clss = clazz; 
     this.args = args; 
    } 

} 

class TabFactory implements TabContentFactory { 

    private final Context mContext; 

    public TabFactory(Context context) { 
     mContext = context; 
    } 

    public View createTabContent(String tag) { 
     View v = new View(mContext); 
     v.setMinimumWidth(0); 
     v.setMinimumHeight(0); 
     return v; 
    } 

} 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 

    initialiseTabHost(savedInstanceState); 
    if (savedInstanceState != null) 
     mTabHost.setCurrentTabByTag(savedInstanceState.getString("tab")); //set the tab as per the saved state 
} 

protected void onSaveInstanceState(Bundle outState) { 
    outState.putString("tab", mTabHost.getCurrentTabTag()); //save the tab selected 
    super.onSaveInstanceState(outState); 
} 

private void initialiseTabHost(Bundle args) { 
    mTabHost = (TabHost)findViewById(android.R.id.tabhost); 
    mTabHost.setup(); 
    TabInfo tabInfo; 

    Tabs.addTab(this, 
      mTabHost, 
      mTabHost.newTabSpec(MAP_TAB).setIndicator(
        MAP_TAB, 
        getResources().getDrawable(R.drawable.ic_tab_map_states)), 
      (tabInfo = new TabInfo(MAP_TAB, HMapFragment_NEW.class, args))); 
    mapTabInfo.put(tabInfo.tag, tabInfo); 

    Tabs.addTab(this, 
      mTabHost, 
      mTabHost.newTabSpec(IMAGES_TAB).setIndicator(
        IMAGES_TAB, 
        getResources().getDrawable(R.drawable.ic_tab_gallery_states)), 
      (tabInfo = new TabInfo(IMAGES_TAB, ImageGridFragment.class, args))); 
    mapTabInfo.put(tabInfo.tag, tabInfo); 

    Tabs.addTab(this, 
      mTabHost, 
      mTabHost.newTabSpec(SETTINGS_TAB).setIndicator(
        SETTINGS_TAB, 
        getResources().getDrawable(R.drawable.ic_tab_settings_states)), 
      (tabInfo = new TabInfo(SETTINGS_TAB, SettingsFragment.class, args))); 
    mapTabInfo.put(tabInfo.tag, tabInfo); 

    // Default to first tab 
    this.onTabChanged(MAP_TAB); 
    mTabHost.setOnTabChangedListener(this); 
} 

private static void addTab(Tabs activity, TabHost tabHost, TabHost.TabSpec tabSpec, TabInfo tabInfo) { 
    // Attach a Tab view factory to the spec 
    tabSpec.setContent(activity.new TabFactory(activity)); 
    String tag = tabSpec.getTag(); 

    // Check to see if we already have a fragment for this tab, probably 
    // from a previously saved state. If so, deactivate it, because our 
    // initial state is that a tab isn't shown. 
    tabInfo.fragment = activity.getSupportFragmentManager().findFragmentByTag(tag); 
    if (tabInfo.fragment != null && !tabInfo.fragment.isDetached()) { 
     FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction(); 
     ft.detach(tabInfo.fragment); 
     ft.commit(); 
     activity.getSupportFragmentManager().executePendingTransactions(); 
    } 

    tabHost.addTab(tabSpec); 
} 

public void onTabChanged(String tag) { 
    TabInfo newTab = this.mapTabInfo.get(tag); 
    // if they've clicked to change tabs 
    if (mLastTab != newTab) { 
     FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); 
     if (mLastTab != null) 
      if (mLastTab.fragment != null) ft.detach(mLastTab.fragment); 
     if (newTab != null) { 
      if (newTab.fragment == null) { 
       newTab.fragment = Fragment.instantiate(this, newTab.clss.getName(), newTab.args); 
       ft.add(R.id.realtabcontent, newTab.fragment, newTab.tag); 
      } else ft.attach(newTab.fragment); 
     } 

     mLastTab = newTab; 
     ft.commit(); 
     this.getSupportFragmentManager().executePendingTransactions(); 
    } 
} 
} 

Odpowiedz

24

tam 3 sposoby, aby usunąć fragment z widzenia:

  • ukryć (hide funkcja na przedmiot transakcji)
  • odłączyć go (detach funkcja na przedmiot transakcji)
  • usunąć go (remove funkcję na przedmiot transakcji)

Jeśli ukryj to widok zostanie ukryty, ale jest nadal w układzie i powinny pozostać nietknięte. Jeśli go odłączysz, widok zostanie zburzony, ale fragment będzie nadal zarządzany przez FragmentManager (i na przykład zostanie odtworzony na zmianę konfiguracji). Jeśli usuniesz , zostanie on całkowicie usunięty z FragmentManager, a jego stan nie będzie już zarządzany.

+0

więc może powinienem spróbować zmienić połączenie odłączenia powyżej, aby się ukryć? – Josh

+0

tak, to powinno załatwić sprawę –

+0

oczywiście również potrzebne do zmiany załącznika, aby dodać, ale dokładnie to, co chciałem! Dzięki! Dokładnie dlaczego używam SO haha ​​ – Josh

Powiązane problemy