每次更改选项卡时,都会调用tabhost上的onCreateView片段

时间:2014-09-13 10:29:09

标签: android android-fragments android-tabhost

我正在使用带片段的tab主机,以下是主要活动的代码

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;
}
} 

这是其中一个片段的代码

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.

所以有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

首先,关于java.lang.IllegalStateException

您尚未初始化mFragmentView

说出类似的话:

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

或:

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

关于每次更改选项卡时片段的更改。 试试这个: 将setRetainInstance(true);添加到片段onAttach()onCreateView()


  

一如既往地打开校正!   问候,   爱德华吉诃德。