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>
Ответы
Ответ 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 Ответ, это хорошее обходное решение.
Извините, я не могу голосовать, так как я новичок.: (
Однако он ничего не отображает в моих фрагментах тестовых вкладок.
Я сделал небольшую модификацию.
<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