web-dev-qa-db-fra.com

findViewById dans Fragment

J'essaie de créer un ImageView dans un fragment qui fera référence à l'élément ImageView que j'ai créé dans le XML pour le fragment. Cependant, la méthode findViewById ne fonctionne que si j'étends une classe d'activité. Y a-t-il un moyen de l'utiliser également dans Fragment?

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ImageView imageView = (ImageView)findViewById(R.id.my_image);
        return inflater.inflate(R.layout.testclassfragment, container, false);
    }
}

La méthode findViewById a une erreur qui indique que la méthode est indéfinie.

899
simplified.

Utilisez getView () ou le paramètre View pour implémenter la méthode onViewCreated. Il retourne la vue racine du fragment (celui renvoyé par la méthode onCreateView()). Avec cela, vous pouvez appeler findViewById().

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
    // or  (ImageView) view.findViewById(R.id.foo); 

Comme getView() ne fonctionne qu'après onCreateView(), vous ne pouvez pas l'utiliser dans les méthodes onCreate() ou onCreateView() du fragment.

1307
advantej

Vous devez gonfler la vue du fragment et appeler findViewById() dans la variable View renvoyée.

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}
577
LeffelMania

Dans la classe Fragment, vous obtiendrez la méthode onViewCreated () override, dans laquelle vous devriez toujours initialiser vos vues, car dans cette méthode, vous obtenez un objet view à l'aide duquel vous pouvez trouver vos vues, par exemple:

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.findViewById(R.id.yourId).setOnClickListener(this);

    // or
    getActivity().findViewById(R.id.yourId).setOnClickListener(this);
}

Rappelez-vous toujours en cas de fragment que la méthode onViewCreated() ne sera pas appelée automatiquement si vous renvoyez null ou super.onCreateView() de la méthode onCreateView() . Elle sera appelée par défaut dans le cas de ListFragment comme ListFragment return FrameLayout par défaut.

Remarque: vous pouvez obtenir la vue fragmentée n’importe où dans la classe en utilisant getView() une fois que onCreateView() a été exécuté avec succès . c'est à dire.

getView().findViewById("your view id");
123
Ankur Chaudhary

Je sais que c’est une vieille question, mais la réponse qui prévaut laisse à désirer.

La question n'est pas claire de savoir ce qui est requis de imageView - la transmettons-nous en tant que vue ou sauvegardons-nous simplement une référence pour plus tard?

Quoi qu'il en soit, si la variable ImageView provient de la présentation gonflée, la méthode correcte consiste à:

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
        return v;
    }
}
65
MattJenko

Commencez par afficher la vue fragmentée puis votre imageView.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
    return view;
}
42
xevincent

Vous pouvez également le faire dans la méthode onActivityCreated

public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState);
}

Comme ils le font ici: http://developer.Android.com/reference/Android/app/Fragment.html(obsolète au niveau de l'API 28)}

getView().findViewById(R.id.foo);

et

getActivity().findViewById(R.id.foo);

sont possibles.

22
friiky

getView() donnera la vue racine

View v = getView().findViewByID(R.id.x); 
18
dreamdeveloper

Vous pouvez remplacer onViewCreated (), qui est appelée juste après que toutes les vues aient été gonflées. C'est le bon endroit pour renseigner les variables View du membre de votre fragment. Voici un exemple:

class GalleryFragment extends Fragment {
    private Gallery gallery;

    (...)

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        gallery = (Gallery) view.findViewById(R.id.gallery);
        gallery.setAdapter(adapter);
        super.onViewCreated(view, savedInstanceState);
    }
}
17
Lez

La méthode getView () ne travaillera pas sur des fragments extérieurs à OnCreate et des méthodes similaires.

Vous avez deux moyens, passez la vue à la fonction sur oncreate (ce qui signifie que vous ne pouvez exécuter vos fonctions que lorsque la vue est créée) ou définissez la vue en tant que variable:

private View rootView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_contatos, container, false);
}

public void doSomething () {
    ImageView thumbnail = (ImageView) rootView.findViewById(R.id.someId);
}
14
sagits
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);  
10
sandhu

1) gonflez d'abord la disposition du fragment, puis utilisez findviewbyId.

View view = inflater.inflate(R.layout.testclassfragment, container, false);
             ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
             return view;
9
priti

d'accord pour appeler findViewById() dans la vue.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View V = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView) V.findViewById(R.id.my_image);

    return V;
}
9
Pajeh

1) Déclarez votre fichier de mise en page. 

public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}

2) Ensuite, obtenez l'id de votre vue 

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}
8
Nanda Gopal

Selon la documentation sur le niveau 11 de l'API

Référence, dans Back Stack http://developer.Android.com/reference/Android/app/Fragment.html

petit code

/**
 * The Fragment's UI is just a simple text view showing its
 * instance number.
 */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.hello_world, container, false);
    View tv = v.findViewById(R.id.text);
    ((TextView)tv).setText("Fragment #" + mNum);
    tv.setBackgroundDrawable(getResources().getDrawable(Android.R.drawable.gallery_thumb));
    return v;
}
8
Dexter

Utiliser getView() renvoie la vue du fragment, vous pouvez appeler findViewById() pour accéder à n’importe quel élément de la vue fragmentée.

8
Mahmoud Badri

Utilisation 

imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);

imageview = (ImageView) getActivity().findViewById(R.id.imageview1);

ça va marcher

8
Manoj ahirwar

Remarque :

À partir de l'API niveau 26, vous n'avez également pas besoin de convertir spécifiquement le résultat de findViewById car il utilise l'inférence pour son type de retour.

Alors maintenant, vous pouvez simplement faire,

public View onCreateView(LayoutInflater inflater, 
                         ViewGroup container, 
                         Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView =  view.findViewById(R.id.my_image); //without casting the return type
     return view;
}
8
Novo Lucas

Essayez ça marche pour moi 

public class TestClass extends Fragment {
    private ImageView imageView;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.testclassfragment, container, false);
        findViews(view);
        return view;
    }

    private void findViews(View view) {
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
7
Bipin Bharti

Il existe une autre méthode appelée onViewCreated.

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    ImageView imageView = (ImageView) view.findViewById(R.id.imageview1);
}
5
Raja Jawahar

essayer

private View myFragmentView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
myFragmentView = inflater.inflate(R.layout.myLayoutId, container, false);
myView = myFragmentView.findViewById(R.id.myIdTag)
return myFragmentView;
}
5
Ramkumar.M

La meilleure façon de mettre cela en œuvre est la suivante: 

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

rootView = inflater.inflate(R.layout.testclassfragment, container, false);
        ImageView imageView = (ImageView) rootView.findViewById(R.id.my_image);
        return rootView
}

De cette manière, rootView peut être utilisé pour chaque contrôle défini dans la présentation XML et le code est beaucoup plus propre de cette manière.

J'espère que cela t'aides :)

5
Michele La Ferla

Utilisez gradle skeleton plugin , il générera automatiquement les classes de détenteurs de vues avec la référence à votre mise en page.

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        MyLayout myLayout = new MyLayout(inflater, container, false);
        myLayout.myImage.setImageResource(R.drawable.myImage);
        return myLayout.view;
    }
}

En supposant maintenant que vous avez déclaré une ImageView dans votre fichier my_layout.xml, la classe myLayout sera automatiquement générée pour vous.

4
Ilya Gazman

À l'intérieur de Fragment classe, vous obtiendrez la méthode onViewCreated() où vous devriez toujours initialiser vos vues, comme dans cette méthode, vous obtenez view avec lequel vous pouvez trouver vos vues, comme :

class MyFragment extends Fragment {
    private ImageView imageView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
        return view;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) 
        super.onViewCreated(view, savedInstanceState);

        //initialize your view here for use view.findViewById("your view id")
        imageView = (ImageView) view.findViewById(R.id.my_image);
    }
}
4
Vipul Prajapati

Essaye ça:

View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);

return v;
4
AbhayBohra

Vous pouvez appeler findViewById() avec le Activity Object vous obtenez votre méthode public void onAttach(Activity activity) dans votre fragment.

Enregistrez l'activité dans une variable, par exemple:

Dans la classe Fragment : private Activity mainActivity;Dans la méthode onAttach(): this.mainActivity=activity;

Enfin, exécutez chaque findViewById à travers le vairable: mainActivity.findViewById(R.id.TextView);

3
mrSurprise

Dans la méthode onCreateView

1) vous devez d’abord gonfler la présentation/vue à ajoutereg. LinearLayout

LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);

2) Ensuite, vous pouvez trouver votre identifiant imageView de la mise en page

ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);

3) retourner la mise en page gonflée

return ll;
2
Devendra Kulkarni

L'inflater de disposition entre dans l'image ici. Layout inflater est une classe qui nous permet d’utiliser les vues XML en code Java. Vous pouvez donc gonfler la vue XML racine dans la variable v avec le code suivant. Et ensuite, en utilisant v, vous pouvez trouver les vues enfant de la vue racine v.

public class TestClass extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v;
    }
}
2
Wijay Sharma

Vous devez gonfler la vue

public class TestClass extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.testclassfragment, container, false);
    ImageView imageView = (ImageView)v.findViewById(R.id.my_image);
    return v
}}
1
Surajit Mondal

Dans les fragments, nous avons besoin d'une vue de cette fenêtre pour pouvoir créer un onCreateView de ce fragment 

Ensuite, obtenez la vue et utilisez-la pour accéder à chaque ID de vue de ces éléments de vue.

  class Demo extends Fragment
    {
        @Override
        public View onCreateView(final LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState)
        {
            View view =inflater.inflate(R.layout.demo_fragment, container,false);
            ImageView imageview=(ImageView)view.findViewById(R.id.imageview1);

            return view;
        }
    }
0
Mayank Garg

La méthode la plus simple consiste à utiliser butterknifeVous pouvez ajouter autant de Onclciklisteners que par @OnClick (), comme décrit ci-dessous:

public class TestClass extends Fragment {
    @BindView(R.id.my_image) ImageView imageView;
    @OnClick(R.id.my_image)
    public void my_image_click(){
        yourMethod();
    }
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.testclassfragment, container, false);
        ButterKnife.bind(getActivity,view);
        return view;
    }
}
0
Amit

getView() fonctionne seulement après onCreateView() terminé, invoquez-le donc depuis onPostCreate():

@Override
public void onPostCreate(Bundle savedInstanceState) {
    super.onPostCreate(savedInstanceState);
    ImageView imageView = (ImageView) getView().findViewById(R.id.foo);
}
0
SwiftArchitect
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.testclassfragment, container, false);
     ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
     return view;
}

Remarquez que si vous utilisez la méthode getView(), cela pourrait causer nullPointerException car il renvoie la vue racine et ce sera une vue après la méthode onCreateView().

0
Mahdi-Malv