简体   繁体   中英

Android: Can't load tab. Says child already has a parent

I have the following FragmentActivity:

public class TabsActivity extends FragmentActivity {
private FragmentTabHost mTabHost;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabs);
    mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);

    mTabHost.addTab(mTabHost.newTabSpec("Home").setIndicator("Home", getResources().getDrawable(R.drawable.hometab)),HomeTab.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Explore").setIndicator("Explore", getResources().getDrawable(R.drawable.exploretab)),ExploreTab.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Info").setIndicator("Info", getResources().getDrawable(R.drawable.infotab)),InfoTab.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Social").setIndicator("Social", getResources().getDrawable(R.drawable.socialtab)),SocialTab.class, null);
    mTabHost.addTab(mTabHost.newTabSpec("Contact").setIndicator("Contact", getResources().getDrawable(R.drawable.contacttab)),ContactTab.class, null);

    TabWidget tabWidget = mTabHost.getTabWidget();
    tabWidget.setStripEnabled(false);
    for(int i=0; i < tabWidget.getChildCount(); i++){
        tabWidget.getChildAt(i).setBackgroundResource(R.drawable.tab_bg);
        TextView tv = (TextView)tabWidget.getChildAt(i).findViewById(android.R.id.title);
        tv.setTextColor(this.getResources().getColor(R.color.white));
    }

    mTabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {
            Log.d("PAUL",tabId);
            if(tabId=="Home"){
                finish();
            }
            TabWidget tw = mTabHost.getTabWidget();
            for(int i=0; i < tw.getChildCount(); i++){
                TextView tabText = (TextView)tw.getChildAt(i).findViewById(android.R.id.title);
                if(tabText.getText()==tabId){
                    tabText.setTextColor(TabsActivity.this.getResources().getColor(R.color.tcmgreen));
                } else {
                    tabText.setTextColor(TabsActivity.this.getResources().getColor(R.color.white));
                }

            }
        }
    });

    Intent intent = getIntent();
    String tag = intent.getStringExtra("tab");
    Log.d("DEBUG",tag);
    mTabHost.setCurrentTabByTag(tag);

}

}

When the user taps the 'Explore' tab I get the following error: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. Here is my ExploreTab class:

public class ExploreTab extends Fragment {
private ArrayList<Level> levels;
private TCMSQLiteHelper sqliteHelper;

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    sqliteHelper = new TCMSQLiteHelper(this.getActivity());
    levels = sqliteHelper.getAllLevels();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Log.d("DEBUG","Explore Created");
    View v = inflater.inflate(R.layout.explorelist, container);

    return v;
}
}

This doesn't make any sense to me because I don't see where there could be a problem of a view already being loaded. What am I missing here?

In onCreateView() , you should be passing in a third parameter, false . This third parameter specifies whether the layout should attached itself to the ViewGroup container .

From the Fragments documentation :

In this case, this is false because the system is already inserting the inflated layout into the container—passing true would create a redundant view group in the final layout.

Thus your code should be:

View v = inflater.inflate(R.layout.explorelist, container, false);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM