web-dev-qa-db-fra.com

findViewById renvoie NULL lors de l'utilisation de Fragment

Je suis nouveau sur Android en développement et bien sûr sur Fragments.

Je souhaite accéder aux commandes de mon fragment dans l'activité principale, mais 'findViewById' renvoie la valeur null . Sans fragment, le code fonctionne correctement.

Voici une partie de mon code:

Le fragment :

<?xml version="1.0" encoding="utf-8"?>
<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="wrap_content"
    Android:orientation="vertical"
    tools:ignore="HardcodedText" >

    <EditText
        Android:id="@+id/txtXML"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:ems="10"
        Android:scrollbars="vertical">
    </EditText>

</LinearLayout>

le onCreate of MainActivity:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);

        this.initialisePaging();

        EditText txtXML = (EditText) findViewById(R.id.txtXML);}

sur ce point le txtXML est nul.

Que manque-t-il dans mon code ou que dois-je faire?

22
mammadalius

Vous devriez inflate la disposition du fragment sur la méthode onCreateView de la Fragment, vous pouvez simplement accéder à ses éléments avec findViewById sur votre Activity.

Dans cet exemple, ma mise en page de fragment est un LinearLayout, aussi jette-t-elle le résultat inflate en LinearLayout.

    public class FrgResults extends Fragment 
    {
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        {
            //some code
            LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false);
            //some code
            return ll;
        }
    }
16
mammadalius

Essayez comme ça sur vos fragments sur onCreateView

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

    if (container == null) {
        return null;
    }

    LinearLayout ll = (LinearLayout )inflater.inflate(R.layout.tab_frag1_layout, container, false);
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML);

    return ll;
}
18
Ufuk Doganca

Je suis en retard, mais pour quiconque ayant ce problème. Vous devriez gonfler votre vue dans la méthode onCreateView. Puis substituez la méthode onCreateActivity et vous pourrez utiliser getView().findViewById ici.

@Override public View onCreateView(LayoutInflater inflater, ViewGroup     container, Bundle savedInstanceState) 
{
     return      inflater.inflate(R.layout.fragment, container, false);
}
5
gdi

Vous ne pouvez pas accéder à la vue du fragment dans la classe d'activité par findViewById à la place. Ce que vous pouvez faire est ...

Vous devez avoir un objet de classe Fragment dans votre fichier d'activité, n'est-ce pas? Créez la méthode getter de la classe EditText dans cette classe de fragments et accédez à cette méthode dans votre activité.

créer un rappel dans la classe Fragment sur l'événement pour lequel vous avez besoin de l'objet Edittext obj.

3
Nixit Patel

1) Essayez ceci:

Menu Eclipse -> Projet -> Nettoyer ...

mettre à jour

2) Si vous avez 2 instances ou plus de disposition 'principale', vérifiez si toutes ont une vue avec l'id 'txtXML'

3) 

Un fragment est un élément de l'interface utilisateur ou du comportement d'une application pouvant être placé dans une activité. L'interaction avec les fragments est effectuée via FragmentManager, qui peut être obtenu via Activity.getFragmentManager () et Fragment.getFragmentManager (). 

La classe Fragment peut être utilisée de différentes manières pour obtenir une grande variété de résultats. C’est le cœur, il représente une opération ou une interface particulière exécutée dans une activité plus grande. Un fragment est étroitement lié à l'activité dans laquelle il se trouve et ne peut pas être utilisé séparément. Bien que Fragment définisse son propre cycle de vie, celui-ci dépend de son activité: si l'activité est arrêtée, aucun fragment à l'intérieur de celle-ci ne peut être démarré; lorsque l'activité est détruite, tous les fragments seront détruits. 

Etudiez ceci . vous devez utiliser FragmentManager.

2
Bobs

Si vous souhaitez utiliser findViewById lors d'activités onCreate, vous pouvez simplement mettre toutes les méthodes surchargées surActivityCreated.

0
Moesio