2012-06-12 29 views
14

Tôi đã làm việc với Android một thời gian, nhưng những mảnh vỡ có một chút mới đối với tôi (vì chúng có thể là đối với hầu hết mọi người). Dù sao, tôi đã có mã dưới đây, và nó hoạt động tốt. Tôi có ba mảnh, một mảnh trong mỗi tab. Tôi tự hỏi nếu nó là bình thường cho onCreateView được gọi là mỗi khi tôi chuyển đổi các tab, và nó có ý nghĩa để làm như vậy? Không nên có cách nào KHÔNG vẽ lại đoạn mỗi khi tab thay đổi?Số lượt truy cập phân đoạn trên Android được gọi là thay đổi tab

Tôi đang chuyển đổi ứng dụng này từ một ứng dụng có 3 hoạt động, một hoạt động trong mỗi tab và có vẻ như lãng phí để tạo lại chế độ xem mỗi khi tab thay đổi, khi nó chỉ ổn khi có lượt xem giữa tab thay đổi ...

BTW, mã này mượn từ: 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(); 
    } 
} 
} 

Trả lời

24

có 3 cách để loại bỏ một Fragment khỏi tầm nhìn:

  • Hide nó (hide chức năng trên đối tượng giao dịch)
  • Detach nó (detach chức năng trên đối tượng giao dịch)
  • Remove nó (remove chức năng trên đối tượng giao dịch)

Nếu bạn ẩn nó quan điểm bị ẩn, nhưng vẫn là trong bố cục và nên giữ nguyên. Nếu bạn tách, chế độ xem bị rách, nhưng đoạn vẫn được quản lý bởi FragmentManager (và sẽ được tạo lại trên thay đổi cấu hình). Nếu bạn xóa, nó sẽ bị xóa hoàn toàn khỏi FragmentManager và trạng thái của nó sẽ không còn được quản lý nữa.

+0

vì vậy có lẽ tôi nên thử thay đổi cuộc gọi tách bên trên để ẩn? – Josh

+0

vâng, điều đó cần làm thủ thuật –

+0

rõ ràng cũng cần phải thay đổi đính kèm để thêm, nhưng chính xác những gì tôi muốn! Cảm ơn! Chính xác là tại sao tôi sử dụng SO haha ​​ – Josh

Các vấn đề liên quan