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.
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.
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;
}
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");
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;
}
}
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;
}
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.
getView()
donnera la vue racine
View v = getView().findViewByID(R.id.x);
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);
}
}
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);
}
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);
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;
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;
}
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);
}
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;
}
Utiliser getView()
renvoie la vue du fragment, vous pouvez appeler findViewById()
pour accéder à n’importe quel élément de la vue fragmentée.
Utilisation
imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);
imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
ça va marcher
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;
}
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);
}
}
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);
}
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;
}
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 :)
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.
À 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);
}
}
Essaye ça:
View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);
return v;
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);
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;
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;
}
}
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
}}
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;
}
}
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;
}
}
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);
}
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()
.