2012-02-10 15 views
17

Tengo una vista de texto en mi Lyout y me gustaría establecer algo de texto en esta vista de texto. Esto debe hacerse en una clase que no sea una clase de actividad principal.findViewById() no funciona en una clase no de actividad principal

El problema es que obtuve una excepción de puntero nulo.

Aquí está mi código:

public class UserInformations extends Activity{ 

TextView emailTextView; 
LocalDatabase localdatabase= new LocalDatabase(this); 


    public void getUserInformation() 
    { 
    emailTextView = (TextView) findViewById(R.id.EmailTextView); 
    String email = localdatabase.getUserEmail(); 
    emailTextView.setText(email); 
    } 
} 

Cuando estoy haciendo esto en la clase de actividad principal es que funciona, pero no funciona no en otra clase.

+0

la emailTextView = (TextView) findViewById (R.id.EmailTextView); –

+0

No, mi base de datos está en otra clase. el valor del correo electrónico es bueno, así que creo que el problema proviene de textView –

Respuesta

29

Llamar a findViewById() en el objeto Activity solo funcionará si el diseño de Actividad actual está establecido en setContentView. Si agrega un diseño a través de otros medios, necesita el objeto View del diseño y llame al findViewById() en él.

View v = inflater.inflate(id_number_of_layout); # such as R.layout.activity_main 
View innerView = v.findViewById(id_number_of_view_inside_v); 

Si el diseño se supone que es la principal disposición de la actividad, a continuación, hacer esto:

public class MyActivity extends Activity{ 
    TextView emailTextView; 

    @Override 
    public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(id_number_of_layout); 
    emailTextView = (TextView) findViewById(R.id.EmailTextView); 
    // ... whatever other set up you need to do ... 
    } 

    public void getUserInformation() { 
    // .... regular code ... 
    } 
} 
+0

Gracias DeeV, tengo algunos problemas para entender este código, lo siento. Entonces, en mi actividad principal, ya estaba llamando al setcontentview (...) pero ahora en mi segunda clase, ¿cómo puedo encontrar el número de id id_number_of_layout y el id_number_of_view_inside_v –

+0

Ya sabes lo que son. En su caso, debe recuperar una instancia del diseño que contiene la vista con el ID 'R.id.EmailTextView'. En general, si está utilizando otra clase fuera de la clase 'Activity', entonces debe pasar la vista mediante el método de constructor o setter. Como la vista principal ya está inflada en su clase de actividad principal, entonces probablemente quiera llamar a 'findViewById (R.id.EmailTextView)' en esa clase, y luego pasar la referencia de objeto de la vista de texto a su otra clase. – DeeV

+0

Ok, muchas gracias, lo haré de esta manera. –

5

No ha configurado el contenido ¿Ver aún?


a hacer este uso algo como esto:

public class MainActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


    } 


} 
+0

No, cómo hacerlo, estoy trabajando por primera vez con la vista de contenido. –

+0

He notado arriba ^^ – FabianCook

+0

Ya lo tengo en mi clase de actividad principal. –

4
findViewById(R.id.EmailTextView); 

Usted ya sea

  1. no se estableció el diseño Ver
  2. No tener Ver con ID EmailTextView, y así findViewById devuelve nulo. No tiene que poner el tipo, sino la ID que le ha dado en el XML.

EDIT: definitivamente el 1 basado en sus nuevos comentarios.

+0

Gracias, pero ¿cómo ver el diseño de la vista? –

3

Cuando llama al findViewById matters. El diseño ya debe haber sucedido. Ya debe haber configurado una vista de contenido, etc.

Existen formas de evitar esto, como se muestra en otras respuestas, pero funcionan fundamentalmente de forma diferente a findViewById, y solo se deben usar como sustituto si comprende exactamente cómo trabajan. La mayoría de las veces es mucho más eficiente simplemente esperar hasta que el diseño inicial ya haya ocurrido.

Cuestiones relacionadas