40 votes

FragmentTabHost mise en page graphique ne rend pas

La charte graphique pour un simple android.de soutien.v4.app.FragmentTabHost ne restitue dans Eclipse ou Android Studio.
La Console d'erreur que je reçois est constante:
Exception raised during rendering: No tab known for tag null

Je suis à l'aide de la plus élémentaire fichier XML:

<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:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

        <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>

mais la même erreur se produit.

Je voulais juste ajouter plus de vues au-dessus ou en dessous de l'onglet widget et le cadre de mise en page.
Je n'aime pas tellement le fait de voir le contenu de l'onglet; je veux juste voir le reste de ma mise en page - mais le problème est que PAS d'AUTRES points de VUE sont rendus lorsqu'un android.support.v4.app.FragmentTabHost réside dans la mise en page.

J'ai lu et essayé de résoudre le problème de la réponse à ce post:
Android: les Onglets en bas avec FragmentTabHost
mais je ne pense pas que c'est mon problème, je ne cherche pas à mettre un TabWidget sur le fond.

Tous les autres un de mes fichiers XML s'ouvre parfaitement.

Le même problème se produit dans Android Studio:
Android Studio doesn't render this either

1voto

J.Nieminen Points 331

Pas sûr au sujet de l'erreur que vous avez (désolé, je suis très occupé en ce moment donc ne peut pas passer plus de temps à vérifier), mais en général, il semble que l' FragmentTabHost de l'appui libs ne se soucie pas du xml à tous. Voir ma réponse précédente à une autre question:

FragmentTabHost avec de défilement horizontale

1voto

Arun Kumar Points 14

De la Mise en page, j'obtiens le même message d'Erreur..donc,je résoudre ce Problème par le Code...Ça fonctionne..s'il vous Plaît essayez ce code

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
            }
        }
    }
}

1voto

AndroidHacker Points 1693

Si U besoin de mettre fragmenté onglets au bas de l'écran ... @jachère ci-dessous --

Faire de votre fichier xml comme ceci ..

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

       <!--   <RelativeLayout 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">  android:layout_alignParentTop="true"  -->

         <FrameLayout
            android:id="@+id/realtabcontent"
            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="0dip"
                android:layout_height="0dip"
                android:layout_weight="0" />

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

    </LinearLayout>

Maintenant, si votre préoccupation est l'ouverture de plusieurs fragments avec en seul fragmenté onglets ...

@suivre les étapes ::

  1. Créer un conteneur fragment. Ce conteneur fragment sera par défaut pour tous vos onglets de contenu.
  2. Pour chaque contenu de l'onglet remplacer le fragment U besoin avec ce conteneur.

Ex:- comme vous remplacez votre lit avec différentes draps de lit .. :)

Votre conteneur fragment de classe qui sera utilisée différemment dans les différents onglets ... "LearnContainerFragment.java "

    public class LearnContainerFragment extends BaseContainerFragment {

        private boolean mIsViewInited;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            Log.e("test", "tab 1 oncreateview");
            return inflater.inflate(R.layout.container_fragment, null);
        }

        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            Log.e("test", "tab 1 container on activity created");
            if (!mIsViewInited) {
                mIsViewInited = true;
                initView();
            }
        }

        private void initView() {
            Log.e("test", "tab 1 init view");
            replaceFragment(new Learn(), false);
        }

    }

LearnContainerFragment.java --- > c'est le fichier xml de container_fragment.xml

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/container_framelayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">


    </FrameLayout>

@ Comment utiliser Conatiner..

  1. Pour chaque fragment U besoin sera remplacé par l'id de ce conteneur fragment.

@dernier votre BaseContainerFragment.java classe --

public class BaseContainerFragment extends Fragment {

    public void replaceFragment(Fragment fragment, boolean addToBackStack) {
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        if (addToBackStack) {
            transaction.addToBackStack(null);
        }
        transaction.replace(R.id.container_framelayout, fragment);
        transaction.commit();
        getChildFragmentManager().executePendingTransactions();
    }

    public boolean popFragment() {
        Log.e("test", "pop fragment: " + getChildFragmentManager().getBackStackEntryCount());
        boolean isPop = false;
        if (getChildFragmentManager().getBackStackEntryCount() > 0) {
            isPop = true;
            getChildFragmentManager().popBackStack();
        }
        return isPop;
    }

}

Espérons que cela aide..... Cheers!

0voto

gedo Points 86

pas sûr.... mais elle ne devrait pas votre mise en page ont un tabhost balise en elle au-dessus de la tabwidget linéaire de mise en page?

<TabHost
    android:id="@+id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
>

j'ai fait une application un que mis en oeuvre des onglets à l'aide de tabhost et c'est ainsi que ma mise en page a été...un onglet, il avait une vue de calendrier on avait une image de l'aiguilleur et on a eu une liste...désolé je ne peux pas être de plus d'aide

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background"
tools:context=".MainActivity" >

<TabHost
    android:id="@+id/tabhost"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/background"
        android:orientation="vertical" >

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

        </TabWidget>

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >

            <LinearLayout
                android:id="@+id/tab1"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >

                <ListView
                    android:id="@+id/listView1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" >
                </ListView>
            </LinearLayout>

            <LinearLayout
                android:id="@+id/tab2"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >

                <ImageSwitcher
                    android:id="@+id/imageSwitcher1"
                    android:layout_width="match_parent"
                    android:layout_height="251dp" >
                </ImageSwitcher>

                <TextView
                    android:id="@+id/tv"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:scrollbars="vertical" />

            </LinearLayout>

            <LinearLayout
                android:id="@+id/tab3"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical" >

                <CalendarView
                    android:id="@+id/calendarView1"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent" />
            </LinearLayout>

        </FrameLayout>
    </LinearLayout>

</TabHost>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X