Este me tiene perplejo.
Necesito llamar a un método de actividad desde una clase de diseño personalizada. El problema con esto es que no sé cómo acceder a la actividad desde el diseño.
ProfileView
public class ProfileView extends LinearLayout
{
TextView profileTitleTextView;
ImageView profileScreenImageButton;
boolean isEmpty;
ProfileData data;
String name;
public ProfileView(Context context, AttributeSet attrs, String name, final ProfileData profileData)
{
super(context, attrs);
......
......
}
//Heres where things get complicated
public void onClick(View v)
{
//Need to get the parent activity and call its method.
ProfileActivity x = (ProfileActivity) context;
x.activityMethod();
}
}
PerfilActividad
public class ProfileActivityActivity extends Activity
{
//In here I am creating multiple ProfileViews and adding them to the activity dynamically.
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.profile_activity_main);
}
public void addProfilesToThisView()
{
ProfileData tempPd = new tempPd(.....)
Context actvitiyContext = this.getApplicationContext();
//Profile view needs context, null, name and a profileData
ProfileView pv = new ProfileView(actvitiyContext, null, temp, tempPd);
profileLayout.addView(pv);
}
}
Como puede ver arriba, estoy instanciando el profileView programáticamente y pasando el ActivityContext con él. 2 preguntas:
- ¿Estoy pasando el contexto correcto a Profileview?
- ¿Cómo obtengo la actividad que contiene el contexto?
android
android-layout
android-activity
view
hierarchy
ARMÓNICO
fuente
fuente
Esto es algo que he utilizado con éxito para convertir
Context
aActivity
funcionar dentro de la interfaz de usuario en fragmentos o vistas personalizadas. Descomprimirá ContextWrapper recursivamente o devolverá nulo si falla.fuente
Hay dos contextos diferentes en Android. Una para su aplicación (llamémosla GRANDE) y otra para cada vista (llamémosla contexto de actividad).
Un diseño lineal es una vista, por lo que debe llamar al contexto de actividad. Para llamarlo desde una actividad, simplemente llame "esto". ¿Tan fácil no es así?
Cuando usas
Llama al contexto GRANDE, el que describe su aplicación y no puede administrar su vista.
Un gran problema con Android es que un contexto no puede llamar a su actividad. Es un gran problema evitar esto cuando alguien comienza con el desarrollo de Android. Debe encontrar una mejor manera de codificar su clase (o reemplazar "Contexto contextual" por "Actividad de actividad" y convertirlo en "Contexto" cuando sea necesario).
Saludos.
Solo para actualizar mi respuesta. La forma más fácil de obtener su
Activity context
es definir unastatic
instancia en suActivity
. Por ejemploY luego, en su
Task
,Dialog
,View
, usted podría utilizar ese tipo de código para obtener suActivity context
:fuente
R
s diferentes ). La gente de Google necesita enriquecer su vocabulario.No ha sido probado y lo codifiqué correctamente. pero estoy transmitiendo una forma de lograr lo que quieres.
Primero de todo crear e interfaz
E implemente esto en cualquier actividad.
y llámalo como
fuente
Context
. Como dice Nepster, la mejor práctica es pasar una devolución de llamada, por lo que cada vez que algo sucede de interés para el padre, la devolución de llamada se activará con los datos relevantes.El contexto puede ser una Aplicación, un Servicio, una Actividad y más.
Normalmente, el contexto de Vistas en una Actividad es la Actividad en sí misma, por lo que puede pensar que puede convertir este Contexto en Actividad, pero en realidad no siempre puede hacerlo, porque el contexto también puede ser un ContextThemeWrapper en este caso.
ContextThemeWrapper se usa mucho en las versiones recientes de AppCompat y Android (gracias al atributo android: theme en los diseños), por lo que personalmente nunca realizaría este reparto.
Entonces, la respuesta corta es: no puede recuperar de manera confiable una Actividad de un Contexto en una Vista. Pase la Actividad a la vista llamando a un método que tome la Actividad como parámetro.
fuente
Nunca use getApplicationContext () con vistas.
Siempre debe ser el contexto de la actividad, ya que la vista se adjunta a la actividad. Además, es posible que tenga un conjunto de temas personalizado y, al usar el contexto de la aplicación, se perderá todo el tema. Lea más sobre diferentes versiones de contextos aquí .
fuente
Y en Kotlin:
fuente
una Actividad es una especialización de Contexto, por lo tanto, si tiene un Contexto ya sabe qué actividad tiene intención de usar y simplemente puede convertir a en c ; donde a es una actividad yc es un contexto.
fuente
Solía convertir Actividad
fuente
Este método debería ser útil ...!
Espero que esto ayude. ¡Feliz codificación!
fuente
¿qué tal una devolución de llamada de datos en vivo,
fuente