web-dev-qa-db-fra.com

Fragment Android pas de vue trouvée pour ID?

J'ai un fragment que j'essaie d'ajouter à une vue.

FragmentManager fragMgr=getSupportFragmentManager();
feed_parser_activity content = (feed_parser_activity)fragMgr
                                    .findFragmentById(R.id.feedContentContainer);
FragmentTransaction xaction=fragMgr.beginTransaction();

if (content == null || content.isRemoving()) {
    content=new feed_parser_activity(item.getLink().toString());
    xaction
        .add(R.id.feedContentContainer, content)
        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
        .addToBackStack(null)
        .commit();
    Log.e("Abstract", "DONE");
}

Lorsque ce code est exécuté, l'erreur suivante apparaît dans le débogage.

Java.lang.IllegalArgumentException: No view found for id 0x7f080011 
   for fragment feed_parser_activity{41882f50 #2 id=0x7f080011}

feed_parser_activity est un fragment défini sur Mise en page des fragments en xml.
J'utilise FragmentActivity pour héberger la présentation de fragment contenant le feed_parser_layout.
.__ Est-ce que je code correctement au dessus?

233
coder_For_Life22

J'avais aussi ce problème, jusqu'à ce que je réalise que j'avais spécifié une mauvaise disposition dans setContentView() de la méthode onCreate() de FragmentActivity.

L'identifiant passé dans FragmentTransaction.add(), dans votre cas R.id.feedContentContainer, doit être un enfant de la présentation spécifiée dans setContentView().

Vous ne nous avez pas montré votre méthode onCreate(), alors c'est peut-être le même problème.

316
howettl

Cette erreur se produit également lorsque vous avez nested Fragments et que vous les ajoutez avec getSupportFragmentManager () au lieu de getChildFragmentManager ().

225
Malachiasz

La solution était d'utiliser getChildFragmentManager()

au lieu de getFragmentManager()

lors de l'appel d'un fragment. Si vous appelez la méthode à partir d'une activité, utilisez getFragmentManager().

Cela résoudra le problème.

48
Sterling Diaz

Un autre scénario que j'ai rencontré ... Si vous utilisez des fragments imbriqués, disons un ViewPager dans un fragment avec ses pages ainsi que des fragments.

Lorsque vous effectuez une transaction de fragment dans le fragment interne (page de ViewPager), vous aurez besoin

FragmentManager fragmentManager = getActivity().getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

getActivity () est la clé ici ....

25
zdd

J'ai eu ce problème (lors de la construction de mon interface utilisateur dans le code) et il était causé par le fait que ma ViewPager (qui affichait Fragments) n'avait pas d'ID défini. J'ai donc simplement utilisé pager.setID(id) et tout a fonctionné.

Cette page m'a aidé à comprendre cela.

25
kaka

J'ai eu cette erreur lorsque je suis passé de com.Android.support:support-v4:21.0.0 à com.Android.support:support-v4:22.1.1

Je devais changer ma mise en page à partir de ceci: 

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

Pour ça:

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

    <FrameLayout
        Android:id="@+id/container_frame_layout"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent">
    </FrameLayout>

</FrameLayout> 

Donc la mise en page DOIT avoir une vue d'enfant. Je suppose qu'ils ont appliqué cela dans la nouvelle bibliothèque. 

11
ono

Une réponse que j'ai lue sur un autre fil similaire à celui-ci qui a fonctionné pour moi lorsque j'ai eu ce problème concernait la mise en page XML. 

Votre logcat indique "Aucune vue trouvée pour l'id 0x7f080011". 

Ouvrez le gen->package->R.Java->id et recherchez l'ID 0x7f080011.

Quand j'ai eu ce problème, cet identifiant appartenait à une FrameLayout dans mon fichier activity_main.xml.

FrameLayout n'avait pas d'identifiant (il n'y avait pas de déclaration Android:id = "blablabla").

Assurez-vous que tous vos composants dans toutes vos présentations ont des ID, en particulier le composant cité dans le logcat.

11
scottyseus

Cette exception peut également se produire si l'ID de mise en page que vous transmettez à FragmentTransaction.replace(int ID, fragment) existe dans d'autres mises en page en cours de gonflage. Assurez-vous que l'ID de présentation est unique et qu'il devrait fonctionner.

9
ealihodzic

Dans mon cas, j'essayais de montrer un DialogFragment contenant un pager et cette exception a été levée lorsque FragmentPagerAdapter a tenté d'ajouter les Fragments au pager. Sur la base de la réponse howettl, je suppose que cela était dû au parent du pageur qui n'était pas la vue définie dans setContentView () dans mon FragmentActivity.

Le seul changement que j'ai fait pour résoudre le problème a été de créer le FragmentPagerAdapter en lui passant un FragmentMager obtenu en appelant getChildFragmentManager () et non celui obtenu en appelant getFragmentManager () comme je le fais normalement.

public class PagerDialog extends DialogFragment{

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.pager_dialog, container, false);

    MyPagerAdapter pagerAdapter = new MyPagerAdapter(getChildFragmentManager());
    ViewPager pager = (ViewPager) rootView.findViewById(R.id.pager);
    pagerAdapter.setAdapter(pagerAdapter);

    return rootView;
}

}

7
garibay

J'avais le même problème, mais mon problème concernait le changement d'orientation. Aucune des autres solutions n'a fonctionné. Il s’est donc avéré que j’avais oublié de supprimer setRetainInstance(true); de mes fragments lors d’une disposition à deux ou à un volet en fonction de la taille de l’écran.

7
VM4

Je sais que cela a déjà été résolu pour un scénario, mais mon problème était légèrement différent et je pensais le partager si quelqu'un d'autre était à ma place.

Je faisais une transaction dans onCreate(), mais à ce stade, l'arborescence de vue n'a pas été gonflée et vous obtenez donc la même erreur. En mettant le code de transaction dans onResume(), tout s'est bien passé.

Assurez-vous simplement que votre code de transaction s'exécute une fois que l'arborescence de la vue a été gonflée!

6
Nick

Mon erreur était sur la FragamentTransaction.

Je faisais cette t.replace(R.layout.mylayout); au lieu de t.replace(R.id.mylayout); 

La différence est que l’un est la mise en page et l’autre une référence à la layout(id)

5
mut tony

J'étais confronté à une erreur Nasty lors de l'utilisation de Viewpager dans Recycler View . Une erreur ci-dessous s'est produite dans une situation particulière . J'ai commencé un fragment contenant RecyclerView avec Viewpager (avec FragmentStatePagerAdapter). Cela a bien fonctionné jusqu'à ce que je passe à un fragment différent en un clic d'une cellule dans RecyclerView, puis que je revienne en arrière à l'aide du bouton Retour du matériel de votre téléphone et que l'application se bloque.

Et ce qui est drôle, c’est que j’avais deux Viewpagers dans le même RecyclerView et que les deux étaient à environ 5 cellules de l’autre (l’autre n’était pas visible à l’écran, il était en panne). Donc, au départ, je viens d'appliquer la solution au premier Viewpager et d'en laisser un autre tel quel (Viewpager using Fragments).

La navigation vers l'arrière a bien fonctionné, lorsque le premier téléavertisseur de vue était visible. Maintenant, quand j'ai fait défiler la liste vers le second, puis que j'ai changé de fragment et que je suis revenu, il s'est écrasé (la même chose s'est produite avec le premier). J'ai donc dû changer les deux Viewpagers.

Quoi qu’il en soit, lisez ci-dessous pour trouver une solution de travail . Erreur d’écrasement ci-dessous:

Java.lang.IllegalArgumentException: No view found for id 0x7f0c0098 (com.kk:id/pagerDetailAndTips) for fragment ProductDetailsAndTipsFragment{189bcbce #0 id=0x7f0c0098}

A passé des heures à le déboguer. Lisez ce message complet jusqu'au bout en appliquant toutes les solutions, notamment en veillant à ce que je réussisse childFragmentManager.

Rien n'a fonctionné.

Enfin, au lieu d’utiliser FragmentStatePagerAdapter, j’ai étendu PagerAdapter et l’ai utilisé dans Viewpager sans utiliser de fragments. Je crois que certains où il y a un BUG avec des fragments imbriqués. Quoi qu'il en soit, nous avons des options. Lis ...

Le lien ci-dessous était très utile:

Viewpager sans fragments

Le lien peut mourir, alors je publie ma solution mise en œuvre ci-dessous:

public class ScreenSlidePagerAdapter extends PagerAdapter {
private static final String TAG = "ScreenSlidePager";
ProductDetails productDetails;
ImageView imgProductImage;
ArrayList<Imagelist> imagelists;
Context mContext;

// Constructor
public ScreenSlidePagerAdapter(Context mContext,ProductDetails productDetails) {
    //super(fm);
    this.mContext = mContext;
    this.productDetails = productDetails;
}

// Here is where you inflate your View and instantiate each View and set their values
@Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater = LayoutInflater.from(mContext);
    ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.product_image_slide_cell,container,false);

    imgProductImage = (ImageView) layout.findViewById(R.id.imgSlidingProductImage);
    String url = null;
    if (imagelists != null) {
        url = imagelists.get(position).getImage();
    }

    // This is UniversalImageLoader Image downloader method to download and set Image onto Imageview
    ImageLoader.getInstance().displayImage(url, imgProductImage, Kk.options);

    // Finally add view to Viewgroup. Same as where we return our fragment in FragmentStatePagerAdapter
    container.addView(layout);
    return layout;
}

// Write as it is. I don't know much about it
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView((View) object);
    /*super.destroyItem(container, position, object);*/
}

// Get the count
@Override
public int getCount() {
    int size = 0;

    if (productDetails != null) {
        imagelists =  productDetails.getImagelist();
        if (imagelists != null) {
            size = imagelists.size();
        }
    }
    Log.d(TAG,"Adapter Size = "+size);
    return size;
}

// Write as it is. I don't know much about it
@Override
public boolean isViewFromObject(View view, Object object) {

    return view == object;
}

}

J'espère que cela a été utile !!

5
Nilesh

Avec fragments imbriqués  

En utilisant getChildFragmentManager() au lieu de getActivity.getSupportFragmentManager() résolu, crash Java.lang.IllegalArgumentException: aucune vue trouvée pour id pour moi.

5
UdayaLakmal

Cette page semble être un bon emplacement central pour poster des suggestions sur l’exception Fragment IllegalArgumentException. Voici une dernière chose que vous pouvez essayer. C'est ce qui a finalement fonctionné pour moi:

J'avais oublié que j'avais un fichier de mise en page séparé pour l'orientation paysage. Après avoir ajouté mon conteneur FrameLayout, le fragment a également fonctionné.


Sur une note séparée, si vous avez déjà essayé tout ce qui est suggéré sur cette page (et Internet entier également) et que vous vous arrachez les cheveux depuis des heures, pensez à vider ces fragments gênants et à revenir à une bonne vieille structure standard. (C'est en fait ce que j'étais en train de faire lorsque j'ai finalement découvert mon problème.) Vous pouvez toujours utiliser le concept de conteneur. Cependant, au lieu de le remplir avec un fragment, vous pouvez utiliser la balise xml include pour le remplir avec la même présentation que celle que vous auriez utilisée dans votre fragment. Vous pouvez faire quelque chose comme ceci dans votre mise en page principale:

<FrameLayout
    Android:id="@+id/container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <include layout="@layout/former_fragment_layout" />

</FrameLayout>

former_fragment_layout est le nom du fichier de disposition XML que vous tentiez d'utiliser dans votre fragment. Voir Réutiliser des mises en page avec include pour plus d’informations.

3
Suragch

J'avais le même problème, laissez-moi poster mon code pour que vous puissiez tous le voir et ne pas faire la même chose que moi.

@Override
protected void onResume()
{
    super.onResume();

    fragManager = getSupportFragmentManager();

    Fragment answerPad=getDefaultAnswerPad();
    setAnswerPad(answerPad);
    setContentView(R.layout.abstract_test_view);
}
protected void setAnswerPad(AbstractAnswerFragment pad)
{
    fragManager.beginTransaction()
        .add(R.id.AnswerArea, pad, "AnswerArea")
        .commit();
    fragManager.executePendingTransactions();
}

Notez que je configurais des fragments avant setContentView. Ooops. 

3
PearsonArtPhoto

Juste au cas où quelqu'un aurait fait la même erreur stupide que moi; vérifiez que vous n'écrasez pas le contenu de l'activité quelque part (c.-à-d. recherchez des appels supplémentaires à setContentView)

Dans mon cas, en raison de copier/coller négligents, j'ai utilisé DataBindingUtil.setContentView dans mon fragment, au lieu de DataBindingUtil.inflate, qui a gâché l'état de l'activité.

3
Squimon

Dans mon cas, j’avais un SupportMapFragment dans un élément de la vue Recycler (j’utilisais le "liteMode", au-dessus de la surcharge, qui faisait apparaître la carte comme non interactive, presque comme une image statique). J'utilisais le bon FragmentManager, et tout semblait bien fonctionner ... avec une petite liste. Une fois que la liste des éléments dépassait un peu la hauteur de l'écran, j'ai commencé à rencontrer ce problème lors du défilement.

En fait, c’est parce que j’étais en train d’injecter un SupportMapFragment dynamique dans une vue, qui se trouvait dans un autre fragment, pour résoudre certains problèmes que je rencontrais lorsque je tentais de le déclarer de manière statique dans mon XML. De ce fait, la disposition des espaces réservés de fragment ne peut être remplacée par le fragment réel qu'une fois la vue attachée à la fenêtre, c'est-à-dire visible à l'écran. J'avais donc mis mon code pour initialiser le SupportMapFragment, effectuer le remplacement de fragment et appeler getMapAsync () dans l'événement onAttachedToWindow.

Ce que j'ai oublié de faire, c'est de m'assurer que mon code ne soit pas exécuté deux fois. C'est à dire. dans l'événement onAttachedToWindow, vérifiez si mon dynamique SupportMapFragment était toujours nul avant d'essayer de créer une nouvelle instance de celui-ci et effectuez un remplacement de fragment. Lorsque l'élément sort du sommet de RecyclerView, il est détaché de la fenêtre, puis rattaché à nouveau lorsque vous y revenez. Cet événement est donc déclenché plusieurs fois.

Une fois que j'ai ajouté le contrôle nul, cela ne s'est produit qu'une fois par élément RecyclerView et le problème a disparu! TL; DR!

2
Breeno

Nettoyez toujours votre projet après toute modification des fichiers de mise en page XML.

Sur Eclipse: Projet> Nettoyer

2
Zafer

J'ai corrigé ce bogue, j'utilise la commitNow() replace commit()

mFragment.getChildFragmentManager()
  .beginTransaction()
  .replace(R.id.main_fragment_container,fragment)
  .commitNowAllowingStateLoss();

commitNow est une méthode de synchronisation, la méthode commit() est une méthode async.

1
user1232595

Dans mon cas, cette exception a été levée lorsque j’utilisais des identifiants différents pour le même élément de présentation (espace réservé de fragment) et que je possédais plusieurs d’entre eux pour différentes variantes de construction. Pour une raison quelconque, cela fonctionne parfaitement bien lorsque vous remplacez fragment pour la première fois, mais si vous essayez de le refaire, vous obtenez cette exception . Assurez-vous donc que vous utilisez le même identifiant si vous avez plusieurs dispositions pour différentes versions. Des variantes.

1
T.K.

J'ai rencontré ce problème lorsque j'ai essayé de remplacer view par mon fragment dans onCreateView(). Comme ça:

public class MyProjectListFrag extends Fragment {


    private MyProjectListFragment myProjectListFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();
    }

Il m'a dit 

11-25 14:06:04.848: E/AndroidRuntime(26040): Java.lang.IllegalArgumentException: No view found for id 0x7f05003f (com.example.myays:id/container_for_my_pro_list) for fragment MyProjectListFragment{41692f40 #2 id=0x7f05003f myProjectListFragment}

Ensuite, j'ai résolu ce problème en mettant replace dans onActivityCreated(). Comme ça:

public class MyProjectListFrag extends Fragment {

    private final static String TAG = "lch";

    private MyProjectListFragment myProjectListFragment;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return inflater
                .inflate(R.layout.frag_my_project_list, container, false);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        FragmentManager mFragmentManager = getFragmentManager();
        myProjectListFragment = new MyProjectListFragment();
        mFragmentManager
                .beginTransaction()
                .replace(R.id.container_for_my_pro_list,
                        myProjectListFragment, "myProjectListFragment")
                .commit();

    }
  1. Vous devez retourner une vue dans onCreateView() pour pouvoir la remplacer plus tard
  2. Vous pouvez placer n'importe quelle opération vers cette vue dans la fonction suivante de fragment liftcycle, comme onActivityCreated()

J'espère que cela t'aides!

1
Stephen Lin

Cela se produit lorsque vous appelez depuis un fragment situé dans un autre.

utilisation : 

getActivity().getSupportFragmentManager().beginTransaction();
1
Arvin Sanaei

Si vous essayez de remplacer un fragment dans un fragment par la variable fragmentManager mais que vous ne gonflez pas le fragment parent, cela peut entraîner un problème.

Dans BaseFragment.JavaOnCreateView:

if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .replace(R.id.container, new DifferentFragment())
                    .commit();
        }

return super.onCreateView(inflater, container, savedInstanceState);

Remplacez super.onCreateView(inflater, container, savedInstanceState); En gonflant la mise en page correcte pour le fragment:

        return inflater.inflate(R.layout.base_fragment, container, false);
0
surfer190

Ce problème se produit également lorsque vous ne mettez pas <include layout="@layout/your_fragment_layout"/> dans votre app_bar_main.xml

0
Bbake Waikhom

J'ai eu le même problème quand je faisais une transaction fragmentée pendant la création d'activité.

Le problème principal est ce que Nick a déjà signalé - La vue n’a pas encore été gonflée. Mais sa solution n'a pas fonctionné - la même exception dans onResume, onPostCreate, etc.

La solution consiste à ajouter un rappel au fragment de conteneur pour signaler qu'il est prêt:

public class MyContainerFragment extends Fragment {
    public static interface Callbacks {
        void onMyContainerAttached();
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        Log.d(TAG, "--- onAttach");
        ((Callbacks) activity).onMyContainerAttached();
    }

    //... rest of code
}

Et puis en activité:

public class MainActivity extends Activity
        implements MyContainerFragment.Callbacks
{
    @Override
    public void onMyContainerAttached() {
        getFragmentManager()
                .beginTransaction()
                .replace(R.id.containerFrame, new MyFragment())
                .commit();
    }

    //...
}
0

J'ai eu le même problème, mon erreur est que j'ai oublié d'ajouter du code xml framlayout à une autre présentation (pour une autre langue) de l'activité. mon application était conçue pour plusieurs langues et j'avais donc deux présentations pour chaque activité. de droite à gauche et de gauche à droite 

0
tahaDev

Dans mon cas, j'utilisais un fichier de classe fragment pour déclarer une classe d'adaptateur listview. Je viens d'utiliser un fichier différent pour la classe d'adaptateur public et l'erreur a disparu.

0
Gauss

Le conteneur pour fragment, cela signifie framelayout ou toute mise en page dans laquelle vous remplacez fragment n'est pas là, ce qui cause le problème, espérons l'aide

Bonne codage!

0
blackHawk

Cela se produit également lorsque vous avez deux vues en deux fragments avec les mêmes identifiants

0
Hossam Hassan

J'ai eu le même problème, car j'avais essayé d'ajouter des fragments avant d'ajouter la disposition du conteneur à l'activité.

0
Rohit