findViewById en fragmento
Estoy intentando crear un ImageView en un Fragmento que hará referencia al elemento ImageView que he creado en el XML para el Fragmento. Sin embargo, el findViewById
método sólo funciona si extiendo una clase de Actividad. ¿Existe alguna forma de que pueda usarlo también en 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);
}
}
El findViewById
método tiene un error que indica que el método no está definido.
Utilice getView() o el parámetro Ver para implementar el onViewCreated
método. Devuelve la vista raíz del fragmento (la que devuelve el onCreateView()
método) . Con esto puedes llamar 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);
}
Como getView()
funciona solo después onCreateView()
, no puedes usarlo dentro onCreate()
o en los onCreateView()
métodos del fragmento.
Debe inflar la vista del Fragmento y llamarlo findViewById()
para que View
regrese.
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;
}
Dentro de Fragment
la clase obtendrá el método de anulación onViewCreated() donde siempre debe inicializar sus vistas, ya que en este método obtiene el objeto de vista mediante el cual puede encontrar sus vistas como:
@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);
}
Recuerde siempre en el caso de Fragment que el onViewCreated()
método no se llamará automáticamente si devuelve nulo o super.onCreateView()
desde onCreateView()
el método. Se llamará de forma predeterminada en caso de que ListFragment
se ListFragment
devuelva FrameLayout
de forma predeterminada.
Nota: puede obtener la vista del fragmento en cualquier parte de la clase utilizando getView()
una vez que onCreateView()
se haya ejecutado correctamente. es decir
getView().findViewById("your view id");