Подтвердить что ты не робот

Android FragmentTabHost: нет закладки, известной для тега null

Я использовал ниже код и не визуализировал графический макет. отобразите ошибку как Exception raised during rendering: No tab known for tag null.

как я могу это решить?

<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0"
            android:orientation="horizontal" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:layout_weight="0" />

        <FrameLayout
            android:id="@+id/realtabcontent"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />
    </LinearLayout>

</android.support.v4.app.FragmentTabHost>
4b9b3361

Ответ 1

Это код, который я использовал для инициализации TabHost, и он отлично работает:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class DetailFragment extends Fragment {

    /**
     * Mandatory empty constructor for the fragment manager to instantiate the fragment (e.g. upon screen orientation changes).
     */
    public DetailFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // R.layout.fragment_tabs_pager contains the layout as specified in your question
        View rootView = inflater.inflate(R.layout.fragment_tabs_pager, container, false);

        // Initialise the tab-host
        FragmentTabHost mTabHost = (FragmentTabHost) rootView.findViewById(R.id.tabhost);
        mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);

        // Initialise this list somewhere with the content that should be displayed
        List<String> itemsToBeDisplayed;

        for (String subItem : itemsToBeDisplayed) {
            // Give along the name - you can use this to hand over an ID for example
            Bundle b = new Bundle();
            b.putString("TAB_ITEM_NAME", subItem);

            // Add a tab to the tabHost
            mTabHost.addTab(mTabHost.newTabSpec(subItem).setIndicator(subItem), YourContentFragment.class, b);
        }
        return rootView;
    }
}

/**
  * This class contains the actual content of a single tab  
  */
public class YourContentFragment extends Fragment {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle extras = getArguments();
        if (extras != null) {
            if (extras.containsKey("TAB_ITEM_NAME")) {
                String subItem = extras.getString("TAB_ITEM_NAME");
                // Do something with that string
            }
        }
    }
}

Ответ 2

Кажется, есть ошибка в библиотеке поддержки android.

Наконец, я нашел это обходное решение:

Изменен файл макета как этот:

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:orientation="horizontal" />

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0" />

</LinearLayout>

Затем я создал код FragmentTabHost в качестве примера:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    tabHost = new FragmentTabHost(getActivity());
    inflater.inflate(R.layout.logs_view, tabHost);
    tabHost.setup(getActivity(), getChildFragmentManager(), android.R.id.tabcontent);

    tabHost.addTab(tabHost.newTabSpec("simple").setIndicator("Simple"), ActivityLogFragment.class, null);
    tabHost.addTab(tabHost.newTabSpec("contacts").setIndicator("Contacts"), MiniStatementFragment.class, null);
    return tabHost;
}

Ответ 3

Я встретил эту проблему, исследовал, но не смог найти никакого рабочего решения. Но я замечаю, что когда я добавляю вкладку сразу после "FragmentTabHost # setup", эта проблема не возникает, но, например, когда я добавляю вкладку в "AsyncTask # onPostExecute", эта проблема возникает. Это кажется глупым, но я пробовал, это так.. Исходя из этого, я нашел решение:

Добавление пустой вкладки сразу после "FragmentTabHost # setup", а затем добавление других вкладок в любом месте, я пробовал это решение, он работает! Я буду макет и частичные коды ниже:

<android.support.v4.app.FragmentTabHost
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <FrameLayout
        android:id="@android:id/tabcontent"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_weight="0"/>

    <FrameLayout
        android:id="@+id/realtabcontent"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <TabWidget
        android:id="@android:id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:orientation="horizontal"/>

</LinearLayout>

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
    mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent);
    TabHost.TabSpec tabSpec = mTabHost.newTabSpec("TAB_FIRST").setIndicator("First");

    mTabHost.addTab(tabSpec, FirstFragment.class, null);

    TabWidget tabWidget = mTabHost.getTabWidget();
    if (tabWidget != null) {
        View tabWidgetChild = tabWidget.getChildAt(0);
        if (tabWidgetChild != null) {
            tabWidgetChild.setVisibility(View.GONE);
        }
    }
}

Ответ 4

У меня возникла аналогичная проблема с использованием tabHost в фрагментах, много искать и, наконец, найти решение для этого.

1) Держите код в режиме создания

2) Это ключ → Пока раздувание макета для индикаторов табуляции используется следующим образом

View tabIndicator = LayoutInflater.from(getActivity()).inflate(R.layout.tab_indicator, mTabHost.getTabWidget(), false);

Нам нужно установить родительское значение в инфляторе как mTabHost.getTabWidget()

Индикатор закладки вкладки, используя приведенный выше код, решил проблему

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

Обновление:

mTabHost = (FragmentTabHost) view.findViewById(android.R.id.tabhost);

mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.realtabcontent);

View tabIndicatorToday = LayoutInflater.from(getActivity()).inflate(R.layout.tab_indicator, mTabHost.getTabWidget(), false);
        ((TextView) tabIndicatorToday.findViewById(R.id.tv_tab_txt)).setText(getResources().getString(R.string.text));

mTabHost.addTab(mTabHost.newTabSpec(getResources().getString(R.string.text)).setIndicator(tabIndicatorToday), Fragment.class, null);

Ответ 5

Эта проблема возникает, когда вы пытаетесь настроить свой FragmentTabHost в onViewCreated, что слишком поздно. Попробуйте установить его в onCreateView и добавьте хотя бы одну вкладку, прежде чем возвращать объект вида.

Ответ 6

Моя среда разработки - Android Studio 0.8.9 с API19 SDK.

Если я поместил FragmentTabHost в FragmentActivity, он будет работать. Когда я помещаю FragmentTabHost в фрагмент, он получает "никакой вкладки, известной для тега null" при визуализации и получает ошибку времени выполнения, когда LayoutInflater раздувает макет.

Спасибо за user3216049 Ответ, это хорошее обходное решение. Извините, я не могу голосовать, так как я новичок.: (

Однако он ничего не отображает в моих фрагментах тестовых вкладок. Я сделал небольшую модификацию.

  • test_fragment.xml

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<FrameLayout
    android:id="@android:id/tabcontent"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_weight="0" />

<FrameLayout
    android:id="@+id/realtabcontent"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"/>

<TabWidget
    android:id="@android:id/tabs"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0"
    android:orientation="horizontal" />

</LinearLayout>

  • fragment_section_dummy.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="24sp"
android:padding="32dp" />

  • Код Java Дело в том, что я меняю идентификатор на "R.id.realtabcontent" в FragmentTabHost.setup()

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTabHost;

public class TestFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, 
                ViewGroup container, Bundle savedInstanceState) {

        FragmentTabHost tabHost = new FragmentTabHost(getActivity());
        inflater.inflate(R.layout.test_fragment, tabHost);
        tabHost.setup(getActivity(), 
                      getChildFragmentManager(), R.id.realtabcontent);

        tabHost.addTab(tabHost.newTabSpec("simple")
            .setIndicator("Simple"), DummySectionFragment.class, null);
        tabHost.addTab(tabHost.newTabSpec("contacts")
            .setIndicator("Contacts"), DummySectionFragment.class, null);
        return tabHost;
    }

    /**
     * A dummy fragment representing a section of the app, 
     * but that simply displays dummy text.
     */
    public static class DummySectionFragment extends Fragment {
        private static int count = 0;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_section_dummy, 
                   container, false);
            ((TextView) rootView.findViewById(android.R.id.text1))
                    .setText("Dummy Section " + count++);
            return rootView;
        }
    }
}

Ответ 7

Я решу свою проблему, ссылаясь на эту ссылку

FragmentTabHost - нет закладки, известной для тега null

Никакая вкладка, известная для тега null его средства tabhost еще не инициализируется, потому что вы trrying в onCreateView метод, который слишком поздно

вызов tabhost в методе onResume