2012-05-06 32 views
19

Soy nuevo en el desarrollo de Android y, por supuesto, en Fragments.findViewById devuelve NULL cuando se usa Fragment

Quiero acceder a los controles de mi fragmento en la actividad principal, pero 'findViewById' devuelve nulo. sin fragmento el código funciona bien.

Aquí es parte de mi código:

El fragmento :

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    tools:ignore="HardcodedText" > 

    <EditText 
     android:id="@+id/txtXML" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:ems="10" 
     android:scrollbars="vertical"> 
    </EditText> 

</LinearLayout> 

onCreate de MainActivity:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     super.setContentView(R.layout.main); 

     this.initialisePaging(); 

     EditText txtXML = (EditText) findViewById(R.id.txtXML);} 

en este punto la txtXML es nulo.

¿Qué falta en mi código o qué debo hacer?

+0

publique su método initialisePaging() – blacharnia

+0

. Hay una importante indicación en 'this.initialisePaging();' simplemente agregue los fragmentos a viewPager – mammadalius

Respuesta

14

Usted debe inflate el diseño del fragmento de onCreateView método de la Fragment, entonces solo puede acceder a sus elementos con findViewById en su Activity.

En este ejemplo, el diseño de mi fragmento es un LinearLayout, así que doy el resultado inflate a LinearLayout.

public class FrgResults extends Fragment 
    { 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      //some code 
      LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.frg_result, container, false); 
      //some code 
      return ll; 
     } 
    } 
+1

¿Cuál es el código? – vasanth

+0

También asegúrese de que si está utilizando el soporte v4 para Android, use 'FragmentActivity' y' getSupportFragmentManager' para evitar obtener un 'null'. Si solo está compilando versiones más nuevas de la API de Android, utilice una 'Actividad' normal y el método' getSupportFragmentManager'. * no * mezcla estas dos formas de implementación –

2

1) Prueba esto:

menú Eclipse -> Proyecto -> Limpiar ...

actualización

2) Si usted tiene 2 o más instancias de diseño 'principal', comprobar si todos ellos tienen una vista con id 'txtXML'

3)

un fragmento es un pedazo de usuario de una aplicación en Terface o comportamiento que se puede colocar en una Actividad. La interacción con fragmentos se realiza a través de FragmentManager, que se puede obtener a través de Activity.getFragmentManager() y Fragment.getFragmentManager().

La clase Fragment se puede usar de muchas maneras para lograr una amplia variedad de resultados. Es básico, representa una operación o interfaz particular que se ejecuta dentro de una Actividad más grande. Un Fragmento está estrechamente ligado a la Actividad en la que se encuentra, y no puede usarse aparte de uno. Aunque Fragment define su propio ciclo de vida, ese ciclo de vida depende de su actividad: si la actividad se detiene, no se pueden iniciar fragmentos dentro de ella; cuando se destruye la actividad, todos los fragmentos serán destruidos.

Estudio this. debes usar FragmentManager.

+0

+1 para resolver otro problema mío pero no este. – mammadalius

+0

¿aún tienes problemas? – breceivemail

+0

¿Tiene solo una instancia de diseño "principal"? – breceivemail

3

no puede acceder a la la vista de un fragmento de la clase de actividad por findViewById lugar lo que puede hacer es ...

Debe tener un objeto de clase Fragmento de que la actividad de archivos, ¿verdad? crea el método getter de la clase EditText en esa clase de fragmento y accede a ese método en tu actividad.

crear una devolución de llamada en la clase Fragmento en el evento donde necesita el obj Edittext.

+0

Selecciono los Fragmentos para mi solución para reducir la complejidad del mismo y también un aumento del rendimiento, pero parece que se ha vuelto más complicado. – mammadalius

+0

no es complicado ... Es potente y puede darte más flexibilidad –

4

Llego tarde, pero para cualquier otra persona que tenga este problema. Debería inflar su vista en el método onCreateView. Luego, anule el método onCreateActivity y puede usar getView().findViewById allí.

@Override public View onCreateView(LayoutInflater inflater, ViewGroup  container, Bundle savedInstanceState) 
{ 
    return  inflater.inflate(R.layout.fragment, container, false); 
} 
+0

Tienes razón. Mis problemas están resueltos antes. Por favor, muestre un fragmento para inflar que otros puedan usar. – mammadalius

+0

'@Override public View onCreateView (Inflador LayoutInflater, contenedor ViewGroup, Bundle savedInstanceState) { return inflater.inflate (R.layout.fragment, container, false); } ' – gdi

+0

Estimado @Futan Escriba su comentario como una respuesta separada con una descripción clara para ser útil para otros y, por supuesto, puedo seleccionarlo como la Respuesta Aceptada. – mammadalius

17

Trate de este tipo en sus fragmentos en onCreateView

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    if (container == null) { 
     return null; 
    } 

    LinearLayout ll = (LinearLayout)inflater.inflate(R.layout.tab_frag1_layout, container, false); 
EditText txtXML = (EditText) ll.findViewById(R.id.txtXML); 

    return ll; 
} 
+0

Esto está resuelto antes. Lo que estaba buscando era txtXML en MainActivity, no en el Fragment. – mammadalius

0

Si desea utilizar findViewById como se utiliza en actividades onCreate, sólo tiene que poner todo en el método overrided onActivityCreated.

+0

devuelve el mismo valor nulo en el método onActivityCreated. – hopeTo

+0

Muéstrame tu código, por favor – Moesio

Cuestiones relacionadas