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.
- Cómo cargar la imagen del GIF en el marcador de posición de Glide / Picasso / Ion etc
- Android subiendo fotos al servidor de la manera más eficiente
- Cómo mover sin problemas una imagen de vista con el dedo de los usuarios en el emulador de Android
- ¿Cómo puedo obtener el mapa de bits en caché que he descargado con Volley ImageLoader?
- Android: Actualización sobre el hilo de la interfaz de usuario muy rápido
- Transición animada entre dos vistas de imagen
- Tome la foto de lo que hay dentro de los límites de superposición
- Cómo dibujar líneas sobre ImageView en Android?
- Las imágenes de gridview de Android en caché, en las imágenes de desplazamiento se repiten antes de ser reemplazadas
- Cómo agregar mediante programación ImageView en LinearLayout sin espacios adicionales?
- Cargando imágenes en un gridview con tarea asíncrona, no cargando correctamente
- Android Image Dialog / Popup
- Google Maps de Google para mostrar como imagen
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!