FindViewById en Fragmento

Estoy tratando de crear un ImageView en un fragmento que se refieren al elemento ImageView que he creado en el XML para el fragmento. Sin embargo, el método findViewById sólo funciona si findViewById una clase de actividad. ¿Hay alguna manera de lo que puedo usar en Fragmento también?

 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 método findViewById tiene un error en él que indica que el método es indefinido.

Utilizar getView () . Devuelve la vista raíz para el fragmento (el que devuelve el método onCreateView() ) . Con esto puede llamar a findViewById() .

 ImageView imageView = (ImageView) getView().findViewById(R.id.foo); 

Como getView() sólo funciona después de onCreateView() , no puede usarlo dentro de los onCreate() o onCreateView() del fragmento.

Necesita inflar la vista del fragmento y llamar a findViewById() en la View que devuelve.

 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 la clase Fragment obtendrá onViewCreated () método de sustitución en el que siempre debe inicializar sus vistas, ya que en este método se obtiene objeto de vista con el que puede encontrar sus puntos de vista 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 Fragmento que el método onViewCreated() no se llamará automáticamente si está devolviendo null o super.onCreateView() del método onCreateView() . Se llamará por defecto en el caso de ListFragment como ListFragment devolver FrameLayout por defecto.

Nota: puede obtener la vista de fragmento en cualquier parte de la clase usando getView() una vez que onCreateView() se haya ejecutado correctamente. es decir

 getView().findViewById("your view id"); 

Me doy cuenta de que esta es una vieja pregunta, pero la respuesta que prevalece deja algo que desear.

La pregunta no es clara de lo que se requiere de imageView – ¿lo estamos pasando de nuevo como la vista, o simplemente guardar una referencia para más tarde?

De cualquier manera, si el ImageView viene del diseño inflado, la forma correcta de hacerlo sería:

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

Obtenga primero la vista de fragmentos y luego obtenga de esta vista su 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; } 

getView() le dará la vista de raíz

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

Puede anular onViewCreated () que se llama justo después de que todas las vistas se han inflado. Es el lugar correcto para rellenar el miembro de Fragmento View variables. He aquí un ejemplo:

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

También puede hacerlo en el método onActivityCreated.

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

Como lo hacen aquí: http://developer.android.com/reference/android/app/Fragment.html

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

y

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

es posible.

El método getView () no funcionará en fragmentos fuera de OnCreate y métodos similares.

Usted tiene dos maneras, pasar la vista a la función en el oncreate (lo que significa que sólo puede ejecutar sus funciones cuando la vista se está creando) o establecer la vista como una 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); 

De acuerdo con llamar a findViewById() en la vista.

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

Según la documentación sobre el API nivel 11

Referencia, en Back Stack http://developer.android.com/reference/android/app/Fragment.html

Código corto

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

El uso de getView() devuelve la vista del fragmento y, a continuación, puede llamar a findViewById() para acceder a cualquier elemento de vista en la vista de fragmentos.

Utilizar

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

funcionará

1) Declare su archivo de disposición.

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

2) A continuación, obtenga el ID de su vista

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

La mejor manera de implementar esto es la siguiente:

 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 esta manera, el rootView se puede utilizar para cada control definido en el diseño xml y el código es mucho más limpio de esta manera.

Espero que esto ayude 🙂

Prueba esto funciona para mí

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

Utilice el complemento de esqueleto gradle, generará automáticamente las clases de titular de vista con la referencia a su diseño.

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

Ahora suponiendo que usted tenía un ImageView declarado en su archivo my_layout.xml , generará automáticamente la clase myLayout para usted.

Hay un método más llamado onViewCreated.

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

Prueba esto:

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

tratar

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

Puede llamar a findViewById() con el Objeto de Actividad que obtiene dentro de su método public void onAttach(Activity activity) dentro de su Fragmento.

Guarde la actividad en una variable, por ejemplo:

En la clase Fragment : private Activity mainActivity; En el método onAttach() : this.mainActivity=activity;

Finalmente, ejecute cada findViewById a través del vairable: mainActivity.findViewById(R.id.TextView);

Dentro del método onCreateView

1) primero tiene que inflar el diseño / vista que desea agregar, por ejemplo. LinearLayout

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

2) A continuación, puede encontrar su imageView id desde el diseño

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

3) devolver el diseño hinchado

 return ll; 

Tienes que inflar la vista

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

El inflador de la disposición entra en cuadro aquí. El inflador de diseño es una clase que nos hace capaces de usar las vistas XML en código java. Así que puede inflar la vista xml de raíz en la variable v con el código siguiente. Y luego usando v, puede encontrar las vistas secundarias de la vista raíz 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; } } 

La manera más fácil de usar tales cosas es utilizar butterknife. Por esto usted puede agregar tantos Onclciklisteners apenas por @OnClick () como descrito abajo:

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

Tenga en cuenta que si utiliza el método getView() podría causar nullPointerException porque devuelve el rootview y será una vista después del método onCreateView() .

En fragmentos necesitamos una vista de esa ventana para que hagamos un onCreateView de este Fragmento.

A continuación, obtener la vista y utilizarlo para acceder a cada vista de identificación de esa vista elementos ..

  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 sincronización de la transacción después de .commit () también puede causar este problema

Conseguí el mismo problema (no se pudo alcanzar la vista en un fragmento). La razón resultó ser que inmediatamente después de (FragmentTransaction) .commit () -, la Vista no se había activado en la interfaz de usuario. No hay garantía cuando , después de .commit (), la transacción tiene lugar; Sólo está en cola. Así que agregué un (FragmentManager) .executePendingTransactions () para forzar la transacción que se va a hacer. Después de eso, hacer referencia a la vista funciona como se esperaba!

  • Recortar y agrandar imagen sin mover la superposición Ver en cambio mover la imagen en ImageView
  • Android: Mostrar la imagen en la vista de imagen por SimpleAdapter
  • Android: Bitmap a Byte Array y espalda: SkImageDecoder :: Factory devuelto null
  • Volley NetworkImageView - cómo reciclar mapas de bits?
  • Animación paralela en Imageview
  • Android - picasso muestra solo marcador de posición, no la imagen de URL
  • Cómo obtener la imagen de url sitio web en imageview en android
  • ¿Son útiles las imágenes vectoriales para Android?
  • 'Falta el atributo contentDescription en la imagen' en XML
  • Agregar Layout de forma programática dentro de otro
  • Android ImageView: Ajustar el ancho
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.