2011-11-30 11 views
32

Tengo una clase que actualmente se extiende Activity y tengo métodos como findViewById, ArrayAdapter etc. Quiero convertirlo en una clase independiente pero todos los métodos anteriores se vuelven indefinido ¿Cuál es el problema? ¿No debería ser suficiente importar las clases? Por ejemplo, importo android.view.View para findViewById pero aún no hace diferencia. por favor asesorar.usando findviewbyid en una clase que NO extiende Activity en android

Respuesta

59

debe pasar la instancia de su actividad a su segunda clase en el constructor de esta manera:

En su Activity instanciate su clase como esta:

MyClass instance = new MyClass(this); 

Y en su segunda clase, la constructor de será así:

public class MyClass { 

public Activity activity; 
//.... other attributes 

public MyClass(Activity _activity){ 

    this.activity = _activity; 
//other initializations... 

} 
} 

y luego cuando se quiere utilizar el findViewById() método, se puede hacer así:

EditText txt = (EditText)this.activity.findViewById(R.id.txt); 
+1

Esto no funciona. findViewById solo se puede invocar en Actividad y no en Contexto. Intenté tu enfoque pero todavía me dio errores. – Namratha

+0

Así que mira mi edición, solo pasa la instancia de la actividad en lugar del contexto :) – Houcine

+0

Ok, lo hice :) Cuando invoco findViewById en el objeto Activity, la vista de lista que intento encontrar es NULL. ¿Eso es porque no he usado setContentView para el archivo XML que contiene el ListView antes? – Namratha

6

findViewById es método público no estático de la clase Activity, por lo que sólo estará disponible para un objetoActivity. Por lo tanto, importar android.view.View y android.app.Activity no lo hará disponible. Para que esté disponible, puede pasar un objeto Actvity, generalmente un punto this en su actividad. Sin embargo, tenga en cuenta que siempre debe actualizar su Vista en el hilo de la interfaz de usuario.

+0

Ok entiendo por qué no está disponible pero no se findViewById un método de la clase View? También podría explicar por qué siempre debemos actualizar nuestra Vista en el hilo de la interfaz de usuario (¿se refiere a la actividad principal?)? – Namratha

8

si quiere llamar a cualquier función que pertenece a Activity continuación, lo único que necesitas es tener contexto de la Activity.

por ejemplo.

class A extends Activity{ 

Context ctx; 
void oncreate(Bundle b) 
ctx = this; 

B bob = new B(ctx); 
} 
} 

Aquí es la clase B.

Class B 
{ 
B(Activity a) 
{ 
a.anyFunctionOfActivity(); 
} 

} 
+1

Esto no funcionaría en un AsyncTask –

+0

@IgorGanapolsky mismo aquí. ¿Qué se debe hacer para que esto funcione en AsyncTask? –

0

Por favor, intente lo siguiente:

public static View getLayoutByRes(@LayoutRes int layoutRes,@Nullable ViewGroup viewGroup) 
{ 
    final LayoutInflater factory = getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    return factory.inflate(layoutRes, viewGroup); 
} 

TextView tv = (TextView) getLayoutByRes(R.layout.xxx ,Null).findViewById(R.id.editd); 
Cuestiones relacionadas