Android obtener actividad de hosting desde una vista
Tengo un Activity
con 3 EditText
s y una vista personalizada que actúa como un teclado especializado para agregar información a los EditText
s.
Actualmente estoy pasando el Activity
en la vista para que pueda obtener el texto de edición actualmente enfocado y actualizar el contenido desde el teclado personalizado.
¿Hay alguna forma de hacer referencia a la actividad padre y obtener el EditText
actualmente enfocado sin pasar la actividad a la vista?
6 answers
Los siguientes métodos pueden ayudarle
-
Activity host = (Activity) view.getContext()
; y view.isFocused()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-16 09:38:16
Acabo de extraer ese código fuente del MediaRouter en la biblioteca de soporte oficial 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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-06 15:04:39
Tomé la respuesta de Gomino y la modifiqué para que encajara perfectamente en myUtils.java para que pueda usarlo donde y cuando lo necesite. 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;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-31 15:40:01
En Android 7+ la vista ya no tiene acceso a la actividad adjunta, por lo que view.getContext()
ya no se puede enviar a una actividad.
En su lugar, el siguiente código funciona en Android 7+ y 6:
private static Activity getActivity(final View view) {
return (Activity) view.findViewById(android.R.id.content).getContext();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-13 15:25:04
[Nota: después de ver esta respuesta, ver mi otro post : https://stackoverflow.com/a/51100507/787399
]
Tengo un enfoque diferente a esto, y esto funciona.
Lo que hago es crear una clase extendida de Aplicación personalizada y marcarla en manifest: -
public class MyApplication extends Application {
private AppCompatActivity currentActivity;
@Override
public void onCreate() {
super.onCreate();
}
public void setCurrentActivity(AppCompatActivity _activity){
this.currentActivity = _activity;
}
public AppCompatActivity getCurrentActivity() {
return currentActivity;
}
}
Y
MiAplicación en manifiesto: -
...
<application
android:name=".core.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
...
Luego en mi BaseActivity (clase abstracta que extiende AppCompatActivity, significa ser extendido por todas las actividades, con común características, delegar clases que desea hacer accesibles en todos los componentes, fragmentos, adaptadores, etc.) :-
...
@Override
protected void onResume() {
super.onResume();
((MyApplication) getApplicationContext()).setCurrentActivity(this);
}
...
Luego en mis Vistas personalizadas (extiende vistas, vistas de texto para aplicar configuraciones de configuración regional y fuentes): -
...
private void setFontFromAsset(Context context, AttributeSet attrs, int defStyle) {
BaseActivity activity = (BaseActivity)((MyApplication) context.getApplicationContext()).getCurrentActivity();
FontAndLocaleManager fontAndLocaleManager = activity.getFontAndLocaleManager();
fontAndLocaleManager.setFontFromAsset(this, R.styleable.FontButton, R.styleable.FontButton_btFontFace, attrs, defStyle);
}
...
Esta solución utiliza el concepto de herencia, clases delegadas y el conocimiento de que se puede acceder al contexto de la aplicación en cualquier lugar (reemplazable con su propia clase extendida de aplicación en manifest, y el ciclo de vida de la actividad, donde en el CV puede dígale a la aplicación (MyApplication) que esta es su actividad actual.
Feliz Codificación... :-)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-01 03:34:44
Para mí esto funcionó:
Context context = SdkUtils.getRootViewContext(getRootView());
Y luego lanzar así (Activity) context
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 06:36:39