FragmentTabHost - No tab known for tag null

后端 未结 3 805
执笔经年
执笔经年 2020-12-29 07:22

Few days ago I implemented TabHostFramgent in a Fragment with a NavigationDrawer, and I faced with a problem that is the following err

相关标签:
3条回答
  • 2020-12-29 07:56

    specify in .xml file where you are using this TabHostFragment(complete path like com.my.TabHostFragment). like

     <com.my.TabHostFragment
            android:id="@+id/fragmentId"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
             />
    
    0 讨论(0)
  • 2020-12-29 08:02

    There is another way to display tabs which can be used here.

    Define TabHostFragment like this:

    public class TabHostFragment extends Fragment implements ActionBar.TabListener{
    
        public TabHostFragment(){
    
        }
    
        AppSectionsPagerAdapter mAppSectionsPagerAdapter;
        ViewPager mViewPager;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.tab_host_test2, container, false);
            return rootView;
        }
    
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState){
            mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getChildFragmentManager());
    
            final ActionBar actionBar = ((FragmentActivity)getActivity()).getSupportActionBar();
    
            actionBar.setHomeButtonEnabled(false);
            actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    
            mViewPager = (ViewPager) view.findViewById(R.id.pager);
            mViewPager.setAdapter(mAppSectionsPagerAdapter);
            mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
    
                @Override
                public void onPageSelected(int position) {
                    actionBar.setSelectedNavigationItem(position);
                }
            });
    
            for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) {
                actionBar.addTab(
                    actionBar.newTab()
                            .setText(mAppSectionsPagerAdapter.getPageTitle(i))
                            .setTabListener(this));
            }
        }
    
        @Override
        public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        }
    
        @Override
        public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
            mViewPager.setCurrentItem(tab.getPosition());
        }
    
        @Override
        public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
        }
    
        public static class AppSectionsPagerAdapter extends FragmentPagerAdapter {
    
            public AppSectionsPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public Fragment getItem(int i) {
                Fragment f = null;
                switch (i) {
                    case 0:
                        f = new MisOfertasFragment();
                        break;
    
                    case 1:
                        f = new RecomendacionesFragment();
                        break;
                }
    
                return f;
            }
    
            @Override
            public int getCount() {
                return 2;
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                return getFragmentTitle(position);
            }
    
            private String getFragmentTitle(int position){
                if(position == 0)
                    return "Tab 1";
                else if(position == 1)
                    return "Tab 2";
                else
                    return "";
            }
        }
    }
    

    Define tab_host_test2.xml like this:

    <android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
    

    Rest of the code remains the same.

    Try this. This should work.

    EDIT:

    Add this to the displayView() method:

    if(position != 0)
        getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    
    0 讨论(0)
  • 2020-12-29 08:08

    As the error suggests

    Java : illegal state exception : no tab known for tag null

    you tried to initialise TabHost but TabHost was null.


    Try the code that I have used to initialise the TabHost and it works fine. Keep you code in onCreateView(). This problem occurs when you try to setup your FragmentTabHost in onViewCreated(), which is called too late. Try to set it up in onCreateView(), and add at least one tab before returning the view Object.

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    
        // Create FragmentTabHost
        mTabHost = new FragmentTabHost(getActivity());
        // Locate fragment1.xml to create FragmentTabHost
        mTabHost.setup(getActivity(), getChildFragmentManager(), R.layout.fragment1);
        mTabHost.addTab(mTabHost.newTabSpec("groups").setIndicator("",getResources().getDrawable(R.drawable.tab_group_icon)),FragmentTab1.class, null);
        mTabHost.addTab(mTabHost.newTabSpec("contacts").setIndicator("",getResources().getDrawable(R.drawable.tab_user_icon)),FragmentTab2.class, null);
    
        MainActivity.fabButton.setVisibility(View.VISIBLE);
        return mTabHost;
    }
    

    change Layout to:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="0dip"
            android:layout_weight="1" />
    
        <android.support.v4.app.FragmentTabHost
            android:id="@android:id/tabhost"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >
    
            <FrameLayout
                android:id="@android:id/tabcontent"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:layout_weight="0" />
    
        </android.support.v4.app.FragmentTabHost>
    
    </LinearLayout>
    

    Hope it helps.

    0 讨论(0)
提交回复
热议问题