2015-08-21 4 views
2

Я в ловушке "No tab content FrameLayout found in XXX" Ошибка. Пожалуйста, помогите.Android: FargmentTabHost - нет содержимого вкладки FrameLayout найдено для id xxx

Мой код идет следовать:

MainActivity

package com.example.demo; 

import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.FragmentTabHost; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 

import com.example.demo.fragments.StateFragment; 


public class MainActivity extends AppCompatActivity { 
    private FragmentTabHost mTabHost; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setSupportActionBar((Toolbar) findViewById(R.id.toolBar)); 
     initTabHost(); 
    } 


    private void initTabHost(){ 
     mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); 
     mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); 
     mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"), 
       StateFragment.class, null); 
    } 
} 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolBar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="?attr/actionBarSize" 
     android:background="?attr/colorPrimary"> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:gravity="center" 
      android:text="Title" /> 

    </android.support.v7.widget.Toolbar> 

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

    <android.support.v4.app.FragmentTabHost 
     android:id="@android:id/tabhost" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" /> 

     <FrameLayout 
      android:id="@android:id/tabcontent" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
    </android.support.v4.app.FragmentTabHost> 
</LinearLayout> 

И LogCat

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.demo/com.example.demo.MainActivity}: java.lang.IllegalStateException: No tab content FrameLayout found for id 2131492952 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: java.lang.IllegalStateException: No tab content FrameLayout found for id 2131492952 
      at android.support.v4.app.FragmentTabHost.ensureContent(FragmentTabHost.java:215) 
      at android.support.v4.app.FragmentTabHost.setup(FragmentTabHost.java:201) 
      at com.example.demo.MainActivity.initTabHost(MainActivity.java:51) 
      at com.example.demo.MainActivity.onCreate(MainActivity.java:23) 
      at android.app.Activity.performCreate(Activity.java:5990) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
            at android.app.ActivityThread.access$800(ActivityThread.java:151) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:135) 
            at android.app.ActivityThread.main(ActivityThread.java:5257) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:372) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Я нашел этот post от Google. Он пришел к этому вопросу с двумя версиями v4 library. Так что я проверил мой

build.gradle:

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:support-v4:22.2.0' 
    compile 'com.android.support:appcompat-v7:22.2.0' 
} 

И ничего на моем каталоге ЛИЭС. Поэтому никакая другая версия v4 lib не вступает в конфликт.

После отладки я обнаружил, что FrameLayout с id "realtabcontent" можно найти в MainActivity. Когда код побежал в шаге:

private void ensureContent() { 
     if (mRealTabContent == null) { 
      mRealTabContent = (FrameLayout)findViewById(mContainerId); 
      if (mRealTabContent == null) { 
       throw new IllegalStateException(
         "No tab content FrameLayout found for id " + mContainerId); 
      } 
     } 
    } 

в FragmentTabHost.java, метод findViewById(mContainerId) возвращение нулевой. Так смущает !!

Так помоги мне, пожалуйста ~ ОРЗ

+0

Пожалуйста, если я помог вам с вашей проблемой, отметьте ответ как исправленный. –

ответ

5

Ваша проблема заключается в том, что вы ссылаетесь ваш tabhost от андроида ресурсов @android: идентификатор/tabhost и framelayout из вашего XML с @ + ид/realtabcontent так система не может раздувать их.

Правильный путь:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical"> 


<android.support.v7.widget.Toolbar 
    android:id="@+id/toolBar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimary"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:text="Title" /> 

</android.support.v7.widget.Toolbar> 



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


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

     <TabWidget 
      android:id="@android:id/tabs" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="bottom"/> 

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

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

И в вашем MainActivity:

mTabHost = (FragmentTabHost) findViewById(android.R.id.tabhost); 
    mTabHost.setup(this, getSupportFragmentManager(), android.R.id.tabcontent); 
    mTabHost.addTab(mTabHost.newTabSpec("simple").setIndicator("Simple"), 
      StateFragment.class, null); 
+0

Благодарим вас за помощь. Но я все еще смущен. Я закодирован в соответствии со страницей: http: //developer.android.com/reference/android/support/v4/app/FragmentTabHost.html и другим сайтом, например: http: //www.programering.com/a/MjNygDNwATM.html , Я обнаружил, что они помещают FrameLayout за пределы FragmentTabHost и назову его идентификатором «readtabcontent», и они работали. –

+0

Обратите внимание, что ваш код не совпадает с кодом на странице, на которую вы ссылались. В этом уроке они используют FragmentTabHost с TabWidget, а затем FrameLayout выше для отображения содержимого фрагмента. –

+0

В коде, который вы используете, с одной стороны, TabWidget и FrameLayout внутри FragmentTabHost, а с другой - FrameLayout, и это неправильно. Проверьте свой код и код вашего примера и посмотрите различия. –

0

Я была такая же проблема, когда я мигрировал мой образец из Затмения в Android Studio.

Я решил эту проблему:

  1. Копирование андроида-поддержки-v4.jar из моей папки проекта Eclipse, в Android Studio
  2. Удаление компиляции «com.android.support:support-v4 : 22.2.0 ' from build.gradle
  3. Сохранение файла компиляцииTree (include: [' *.jar '], dir:' libs ')