1

У меня есть фрагмент фрагмента в фрагменте. У меня есть 4 вкладки. Когда я нажимаю вкладки, onCreateView вкладки запускается, хотя я использую транзакцию фрагмента, чтобы скрыть ее?FragmentTabHost запускает onCreateView, хотя фрагмент скрыт

я отлажена и обнаружил, что, когда я нажимаю на вкладку создать на вкладке дома

CreateFragment createFragment = (CreateFragment) fm.findFragmentByTag(CREATE_TAG); 

равна нулю, даже если я добавил его в tabHost.addTab?

Как перемещаться между вкладками и не вызывать onCreateView для каждого фрагмента?

Спасибо

Это класс фрагмент

public class TabFragment extends Fragment { 

public static final String HOME_TAG = "home"; 
public static final String CREATE_TAG = "create"; 
public static final String SEARCH_TAG = "search"; 
public static final String PROFILE_TAG = "profile"; 


private MyFragmentTabHost tabHost; 
private MyFragmentTabHost.TabInfo tabInfo; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState){ 
    View view = inflater.inflate(R.layout.fragment_tab, viewGroup, false); 

    tabHost = (MyFragmentTabHost) view.findViewById(android.R.id.tabhost); 
    tabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent); 
    tabHost.addTab(tabHost.newTabSpec(HOME_TAG).setIndicator(getString(R.string.tab_home)), HomeFragment.class, null); 
    tabHost.addTab(tabHost.newTabSpec(CREATE_TAG).setIndicator(getString(R.string.tab_create)), CreateFragment.class, null); 
    tabHost.addTab(tabHost.newTabSpec(SEARCH_TAG).setIndicator(getString(R.string.tab_search)), CreateFragment.class, null); 
    tabHost.addTab(tabHost.newTabSpec(PROFILE_TAG).setIndicator(getString(R.string.tab_profile)), CreateFragment.class, null); 

    MyFragmentTabHost.OnTabChangeListener tabListener = new MyFragmentTabHost.OnTabChangeListener() { 
     @Override 
     public void onTabChanged(String s) { 
      FragmentManager fm = getChildFragmentManager(); 
      HomeFragment homeFragment = (HomeFragment) fm.findFragmentByTag(HOME_TAG); 
      CreateFragment createFragment = (CreateFragment) fm.findFragmentByTag(CREATE_TAG); 

      FragmentTransaction ft = fm.beginTransaction(); 

      if(s.equalsIgnoreCase(HOME_TAG)){ 
       if(homeFragment == null) 
        ft.add(R.id.tabcontent, new HomeFragment(), HOME_TAG); 
       else{ 
        if(createFragment != null) 
         ft.hide(createFragment); 
        ft.show(homeFragment); 
       } 
      } 
      else if(s.equalsIgnoreCase(CREATE_TAG)){ 
       if(createFragment == null) 
        ft.add(R.id.tabcontent, new CreateFragment(), CREATE_TAG); 
       else{ 
        if(homeFragment != null) 
         ft.hide(homeFragment); 
        ft.show(createFragment); 
       } 
      } 

      ft.commit(); 
     } 
    }; 

    tabHost.setOnTabChangedListener(tabListener); 

    return view; 
} 
} 

ответ

1

В FragmentTabHost:

private FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) { 
    TabInfo newTab = null; 
    for (int i=0; i<mTabs.size(); i++) { 
     TabInfo tab = mTabs.get(i); 
     if (tab.tag.equals(tabId)) { 
      newTab = tab; 
     } 
    } 
    if (newTab == null) { 
     throw new IllegalStateException("No tab known for tag " + tabId); 
    } 
    if (mLastTab != newTab) { 
     if (ft == null) { 
      ft = mFragmentManager.beginTransaction(); 
     } 
     if (mLastTab != null) { 
      if (mLastTab.fragment != null) { 
       ft.detach(mLastTab.fragment); 
      } 
     } 
     if (newTab != null) { 
      if (newTab.fragment == null) { 
       newTab.fragment = Fragment.instantiate(mContext, 
         newTab.clss.getName(), newTab.args); 
       ft.add(mContainerId, newTab.fragment, newTab.tag); 
      } else { 
       ft.attach(newTab.fragment); 
      } 
     } 

     mLastTab = newTab; 
    } 
    return ft; 
} 

Transaction.attach (фрагмент) будет воссоздавать вид, детали в исходном коде. Таким образом, вы можете в вашем фрагменте добавить такой код:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    if (!isCreated || mRootView == null) { 
     isCreated = true; 
     mRootView = inflater.inflate(R.layout.fragment_home_task, container, false); 
     ButterKnife.bind(this,mRootView); 
     onViewInitialized(); 
    } 
    return mRootView; 
} 
0

Каждый коммутатор FragmentTabHost фрагментов будет вызывать onCreateView() перерисовать интерфейс.

В FragmentTabHost.java есть метод частного:

FragmentTransaction doTabChanged(String tabId, FragmentTransaction ft) 
    private FragmentTransaction doTabChanged(String tabId, 
     FragmentTransaction ft) { 
    TabInfo newTab = null; 
    for (int i = 0; i < mTabs.size(); i++) { 
     TabInfo tab = mTabs.get(i); 
     if (tab.tag.equals(tabId)) { 
      newTab = tab; 
     } 
    } 
    if (newTab == null) { 
     throw new IllegalStateException("No tab known for tag " + tabId); 
    } 
    if (mLastTab != newTab) { 
     if (ft == null) { 
      ft = mFragmentManager.beginTransaction(); 
     } 
     if (mLastTab != null) { 
      if (mLastTab.fragment != null) { 
       **// hide replace of detach,hFragment 
       // ft.detach(mLastTab.fragment);** 
       ft.hide(mLastTab.fragment); 
      } 
     } 
     if (newTab != null) { 
      if (newTab.fragment == null) { 
       newTab.fragment = Fragment.instantiate(mContext, 
         newTab.clss.getName(), newTab.args); 
       ft.add(mContainerId, newTab.fragment, newTab.tag); 
      } else { 
       **// show replace of attach,then show the Fragment 
       // ft.attach(newTab.fragment);** 
       ft.show(newTab.fragment); 
      } 
     } 

     mLastTab = newTab; 
    } 
    return ft; 
} 

Затем использовать эту FragmentTabHost вместо support.v4.FragmentTabHost.

Смежные вопросы