getsupportfragmentmanager - findviewbyid in fragment android
findViewById en fragmento (30)
Estoy tratando de crear un ImageView en un Fragmento que se referirá al elemento ImageView que he creado en el XML para el Fragmento. Sin embargo, el método findViewById
solo funciona si extiendo una clase de actividad. ¿Hay alguna forma de que pueda usarlo también en Fragmento?
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 que indica que el método no está definido.
1) Declara tu archivo de diseño.
public View onCreateView(LayoutInflater inflater,ViewGroup container,
Bundle savedInstanceState) {
return inflate(R.layout.myfragment, container, false);
}
2) Entonces, obtén el id de tu vista
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView nameView = (TextView) view.findViewById(R.id.textview1);
}
1) primer diseño inflado de Fragmento, luego puede usar findviewbyId.
View view = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView imageView = (ImageView) view.findViewById(R.id.my_image);
return view;
Dentro de la clase de Fragment
obtendrás el método de anulación onViewCreated() donde siempre deberías inicializar tus vistas, ya que en este método obtienes un objeto de vista con el que puedes encontrar tus 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);
}
Siempre recuerde en el caso de Fragment que el método onViewCreated()
no se llamará automáticamente si está devolviendo null o super.onCreateView()
desde el método onCreateView()
. Se llamará de forma predeterminada en el caso de ListFragment
como ListFragment
devolver FrameLayout
de forma predeterminada.
Nota: puede obtener la vista de fragmentos en cualquier lugar de la clase utilizando getView()
una vez que onCreateView()
se haya ejecutado correctamente. es decir
getView().findViewById("your view id");
Dentro del método onCreateView
1) primero debe inflar el diseño / vista que desea agregar, por ejemplo. LinearLayout
LinearLayout ll = inflater.inflate(R.layout.testclassfragment, container, false);
2) Luego puedes encontrar tu id de imageView desde el diseño
ImageView imageView = (ImageView)ll.findViewById(R.id.my_image);
3) devolver el diseño inflado
return ll;
El inflador de la disposición entra en la imagen aquí. Layout inflater es una clase que nos permite usar las vistas XML en código java. Por lo tanto, puede inflar la vista xml raíz en la variable v con el siguiente código. Y luego, utilizando 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;
}
}
El método getView () no funciona en fragmentos fuera de OnCreate y métodos similares.
Tiene dos formas, pase la vista a la función en oncreate (lo que significa que solo puede ejecutar sus funciones cuando se crea la vista) o configure 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);
}
El uso de getView()
devuelve la vista del fragmento, luego puede llamar a findViewById()
para acceder a cualquier elemento de vista en la vista de fragmento.
En fragmentos, necesitamos una vista de esa ventana para poder hacer una vista en línea de este fragmento.
A continuación, obtenga la vista y utilícela para acceder a cada ID de vista de los elementos de esa vista.
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;
}
}
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);
}
La forma más fácil de usar tales cosas es usar Butterknife. De esta forma, puede agregar tantos Onclciklisteners solo con @OnClick () como se describe a continuación:
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;
}
}
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 usar 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 :)
Me doy cuenta de que esta es una pregunta antigua, pero la respuesta prevaleciente deja algo que desear.
La pregunta no está clara qué se requiere de imageView
: ¿lo estamos devolviendo como vista o simplemente guardando una referencia para más adelante?
De cualquier manera, si ImageView
proviene 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;
}
}
Nota :
Desde el nivel 26 de API, tampoco es necesario que emita específicamente el resultado de findViewById, ya que usa la inferencia para su tipo de retorno.
Así que ahora puedes simplemente hacer,
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;
}
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;
}
Prueba esto me funciona
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);
}
}
Prueba esto:
View v = inflater.inflate(R.layout.testclassfragment, container, false);
ImageView img = (ImageView) v.findViewById(R.id.my_image);
return v;
Puede anular onViewCreated (), que se llama justo después de que se hayan inflado todas las vistas. Es el lugar correcto para completar las variables de View
miembro de tu Fragmento. Aquí hay 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);
}
}
Puede llamar a findViewById()
con el objeto de actividad que obtiene dentro de su public void onAttach(Activity activity)
dentro de su fragmento.
Guarda la actividad en una variable por ejemplo:
En la clase Fragmento : private Activity mainActivity;
En el método onAttach()
: this.mainActivity=activity;
Finalmente, ejecute todos los findViewById a través de vairable: mainActivity.findViewById(R.id.TextView);
Según la documentación en nivel API 11.
Referencia, en la pila posterior 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;
}
También puedes 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 (en desuso en el nivel 28 de API)
getView().findViewById(R.id.foo);
y
getActivity().findViewById(R.id.foo);
es posible.
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
}}
Use getView() o el parámetro Ver para implementar el método onViewCreated
. Devuelve la vista raíz del fragmento (la que devuelve el método onCreateView()
) . Con esto puedes llamar a 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 de onCreateView()
, no puede usarlo en los onCreate()
o onCreateView()
del fragmento.
Utilice el complemento esqueleto de Gradle, que 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 haya declarado un ImageView
en su archivo my_layout.xml
, generará automáticamente la clase myLayout para usted.
Utilizar
imagebutton = (ImageButton) getActivity().findViewById(R.id.imagebutton1);
imageview = (ImageView) getActivity().findViewById(R.id.imageview1);
funcionará
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;
}
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;
}
findViewById()
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;
}
getView()
dará la vista raíz
View v = getView().findViewByID(R.id.x);
EditText name = (EditText) getView().findViewById(R.id.editText1);
EditText add = (EditText) getView().findViewById(R.id.editText2);
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()
, puede provocar nullPointerException
porque devuelve la vista de raíz y será una vista posterior onCreateView()
método onCreateView()
.