2014-09-13 43 views
2

我使用與片段標籤主機時間,以下是主要活動的代碼上tabhost onCreateView片段叫我每次更改選項卡

public class HomeActivity extends Activity{ 

private FragmentTabHost     mTabHost; 
private ArrayList<CustomTabIndicator> mCustomTabIndicator; 
private ArrayList<BaseFragment>   mTabFragments; 


private class CustomTabIndicator { 

    private int mIdResId; 
    private int mTitleResId; 
    private int mIconResId; 

    public CustomTabIndicator(int idResId, int titleResId, int iconResId) { 

     this.mIdResId = idResId; 
     this.mTitleResId = titleResId; 
     this.mIconResId = iconResId; 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home_screen); 

    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 

    initializeTabIndicatorsAndFragments(); 
    addTabIndicatorsToTabHost(); 
} 

private void initializeTabIndicatorsAndFragments() { 

    mCustomTabIndicator = new ArrayList<HomeActivity.CustomTabIndicator>(); 

    mCustomTabIndicator.add(new CustomTabIndicator(R.string.tab_dashboard, 
      R.string.tab_dashboard, R.drawable.tab_dashboard)); 

    mCustomTabIndicator.add(new CustomTabIndicator(R.string.tab_feed, 
      R.string.tab_feed, R.drawable.tab_feed)); 

    mCustomTabIndicator.add(new CustomTabIndicator(R.string.tab_lists, 
      R.string.tab_lists, R.drawable.tab_lists)); 

    mCustomTabIndicator.add(new CustomTabIndicator(R.string.tab_me, 
      R.string.tab_me, R.drawable.tab_me)); 

    mTabFragments = new ArrayList<BaseFragment>(); 


    mTabFragments.add(new DashboardFragment()); 
    mTabFragments.add(new FeedFragment()); 
    mTabFragments.add(new ListsFragment()); 
    mTabFragments.add(new MeFragment()); 
} 

private void addTabIndicatorsToTabHost() { 

    for (int i = 0; i < mCustomTabIndicator.size(); i++) { 
     mTabHost.addTab(
       mTabHost.newTabSpec(
         getString(mCustomTabIndicator.get(i).mIdResId)) 
         .setIndicator(
           createTabView(
             this, 
             mCustomTabIndicator.get(i).mTitleResId, 
             mCustomTabIndicator.get(i).mIconResId)), 
       mTabFragments.get(i).getClass(), null); 
    } 

} 

@SuppressLint("InflateParams") 
private View createTabView(final Context context, final int textStringId, 
     final int imageResId) { 

    View view = LayoutInflater.from(context).inflate(
      R.layout.fragment_tab_header_image_text_layout, null); 

    ImageView tabIV = (ImageView) view.findViewById(R.id.tab_icon); 
    tabIV.setImageResource(imageResId); 
    //TextView titleTV = (TextView) view.findViewById(R.id.tab_title); 
    //titleTV.setText(textStringId); 
    return view; 
} 
} 

這是fragements之一的代碼

public class MeFragment extends BaseFragment { 

private View     mFragementView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    Log.i("AMIRA", "MeFragment - onCreateView"); 
    mFragementView = inflater.inflate(R.layout.fragment_me_screen,container, false); 

    initializeUIComponents(); 
    initializeUIComponentsData(); 
    initializeUIComponentsTheme(); 
    initializeUIComponentsAction(); 

    return mFragementView; 

} 
} 

現在的問題是,每次更改選項卡時都會調用onCreateView,並花費很長時間來渲染和繪製片段的內容。

所以我曾嘗試下面的代碼

public class MeFragment extends BaseFragment { 

private View     mFragementView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    if (mFragementView != null) { 
     return mFragementView; 
    } else {  
     Log.i("AMIRA", "MeFragment - onCreateView"); 
     mFragementView = inflater.inflate(R.layout.fragment_me_screen,container, false); 

     initializeUIComponents(); 
     initializeUIComponentsData(); 
     initializeUIComponentsTheme(); 
     initializeUIComponentsAction(); 

     return mFragementView; 
    } 

} 
} 

和我得到了以下異常

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

所以任何人都可以幫助嗎?

+0

這是正常現象。 * ...並花費很長時間來渲染和繪製片段的內容。* - 您可能希望在此改進您的代碼。 – Luksprog 2014-09-13 10:50:33

回答

2

其一,關於java.lang.IllegalStateException

您還沒有初始化mFragmentView

這樣說:

mFragmentView = (View)getActivity().findViewById(R.id.mFragmentView); 

或:

mFragmentView = (View)getActivity().findFragmentById(R.id.mFragmentView); 

二有關片段改變,每一次改變標籤的時間。 試試這個: 將setRetainInstance(true);添加到碎片onAttach()onCreateView()


打開了修正,一如既往! 關心, 愛德華吉訶德。

相關問題