2011-11-26 22 views
127

Tengo un Activity con 3 EditText sy una vista personalizada que actúa como un teclado especializado para agregar información en el EditText s.Android obtener alojamiento Actividad desde una vista

Actualmente paso el Activity en la vista para que pueda obtener el texto de edición actualmente enfocado y actualizar los contenidos desde el teclado personalizado.

¿Hay alguna manera de hacer referencia a la actividad primaria y obtener el EditText actualmente centrado sin pasar la actividad a la vista?

+5

La respuesta correcta es de gomino. – djunod

Respuesta

152

siguientes métodos pueden ayudarle a

  1. Activity host = (Activity) view.getContext(); y
  2. view.isFocused()
+25

Simplemente no olvide que 'getContext()' no siempre puede devolver un objeto Activity si su Vista no es invocada desde un contexto de Actividad. Asegúrese de planificar esto con anticipación y proporcionar una alternativa adecuada. –

+1

@WordPressDeveloper - ¿Cómo se puede crear una vista sin una actividad? ¿Te refieres a vista remota? ¿Hay otros casos de vistas que se crean fuera de una actividad? –

+1

@kilaka Widgets, Fragments, RemoteViews, LayoutInflaters son todos los casos en los que puede crear una vista que no esté vinculada a una actividad. –

195

que acaba de sacar que el código fuente de la MediaRouter en el official support library y hasta ahora funciona bien:

private Activity getActivity() { 
    Context context = getContext(); 
    while (context instanceof ContextWrapper) { 
     if (context instanceof Activity) { 
      return (Activity)context; 
     } 
     context = ((ContextWrapper)context).getBaseContext(); 
    } 
    return null; 
} 
+5

while? porque mientras? –

+2

Es solo una forma de pasar a través de todo el contexto base, hasta que se encuentre la actividad, o salir del ciclo cuando se encuentre el contexto raíz.Porque el contexto raíz tendrá un baseContext nulo, que conduce al final del ciclo. – Gomino

+10

Esta es una mejor manera de hacerlo. Debe ser marcado como una respuesta. – shadox

0

En Android 7+ la vista no tiene acceso a la envolvente actividad más, por lo que view.getContext() ya no se puede convertir a una actividad.

lugar, el código siguiente funciona en Android 7+ y 6:

private static Activity getActivity(final View view) { 
    return (Activity) view.findViewById(android.R.id.content).getContext(); 
} 
1

Tomé Gomino 's answer y lo modificó para encajar perfectamente en myUtils.java para que pueda utilizarlo en cualquier lugar y siempre que necesito . Espero que alguien lo encuentre útil :)

abstract class myUtils { 
    public static Activity getActivity(View view) { 
     Context context = view.getContext(); 
     while (context instanceof ContextWrapper) { 
      if (context instanceof Activity) { 
       return (Activity)context; 
      } 
      context = ((ContextWrapper)context).getBaseContext(); 
     } 
     return null; 
    } 
} 
Cuestiones relacionadas