Question findViewById dans Fragment


J'essaye de créer un ImageView dans un Fragment qui se rapportera à l'élément d'ImageView que j'ai créé dans le XML pour le Fragment. Cependant, le findViewById La méthode ne fonctionne que si j'étends une classe Activity. Y a-t-il un moyen de m'en servir 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);
    }
}

le findViewById La méthode a une erreur qui indique que la méthode n'est pas définie.


842
2018-06-27 16:24


origine


Réponses:


Utilisation getView () ou le paramètre View de la mise en œuvre du onViewCreated méthode. Il renvoie la vue racine pour le fragment (celui retourné par onCreateView() méthode). 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(), toi ne peut pas l'utiliser à l'intérieur onCreate() ou onCreateView() méthodes du fragment.


1224
2018-06-27 16:34



Vous devez gonfler la vue du fragment et appeler findViewById() sur le View ça revient.

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

553
2018-06-27 16:35



À l'intérieur Fragment classe vous obtiendrez onViewCreated () méthode de substitution où vous devriez toujours initialiser vos vues comme dans cette méthode vous obtenez l'objet de vue à l'aide duquel vous pouvez trouver vos vues comme:

@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 onViewCreated() méthode ne sera pas appelée automatiquement si vous renvoyez null ou super.onCreateView() de onCreateView() méthode. Il sera appelé par défaut en cas de ListFragment comme ListFragment revenir FrameLayout par défaut.

Note: vous pouvez obtenir la vue de fragment 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");

115
2018-03-04 14:46



Je réalise que c'est une vieille question, mais la réponse dominante laisse à désirer.

La question n'est pas claire ce qui est requis de imageView - est-ce que nous le renvoyons en tant que vue, ou enregistrez-vous simplement une référence pour plus tard?

De toute façon, si le ImageView vient de la mise en page gonflée, la bonne façon de le faire serait:

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

61
2018-04-11 10:46



Obtenez d'abord l'affichage du fragment, puis obtenez à partir de cette vue 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;
}

41
2018-06-27 16:35



Vous pouvez aussi le faire dans le onActivityCreated Méthode.

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 API 28)

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

et

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

sont possibles.


19
2017-10-09 23:22



getView() donnera la vue racine

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

18
2017-09-03 12:41



Vous pouvez remplacer onViewCreated () qui est appelé juste après que toutes les vues ont été gonflées. C'est le bon endroit pour remplir le membre de votre Fragment View variables 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
2018-03-28 15:58