Android obtener actividad de hosting desde una vista


Tengo un Activity con 3 EditTexts 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?

Author: Macarse, 2011-11-26

6 answers

Los siguientes métodos pueden ayudarle

  1. Activity host = (Activity) view.getContext(); y
  2. view.isFocused()
 163
Author: Dipesh Rathod,
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;
}
 228
Author: Gomino,
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;
    }
}
 3
Author: brownieGirl,
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();
}
 1
Author: Sebas LG,
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... :-)

 0
Author: Abhinav Saxena,
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

 -1
Author: niti,
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