Это меня поставило в тупик.
Мне нужно вызвать метод деятельности из пользовательского класса макета. Проблема в том, что я не знаю, как получить доступ к активности из макета.
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();
}
}
ProfileActivity
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);
}
}
Как вы можете видеть выше, я создаю экземпляр profileView программно и передаю им ActivityContext. 2 вопроса:
- Я передаю правильный контекст в профиль?
- Как я могу получить содержащую деятельность из контекста?
Это то , что я успешно используется для преобразования
Context
вActivity
при работе в пользовательском интерфейсе в фрагментов или пользовательских представлений. Он будет распаковывать ContextWrapper рекурсивно или вернет ноль в случае сбоя.источник
В Android есть два разных контекста. Одна для вашего приложения (назовем это БОЛЬШОЙ) и одна для каждого представления (назовем это контекстом активности).
LinearLayout - это представление, поэтому вы должны вызвать контекст действия. Чтобы вызвать это из действия, просто назовите это. Так просто, не правда ли?
Когда вы используете
Вы вызываете БОЛЬШОЙ контекст, который описывает ваше приложение и не может управлять вашим представлением.
Большая проблема с Android состоит в том, что контекст не может вызвать вашу активность. Это большая проблема, чтобы избежать этого, когда кто-то начинает разработку Android. Вы должны найти лучший способ кодирования вашего класса (или заменить «Контекст контекста» на «Активность действия» и при необходимости привести его к «Контексту»).
С уважением.
Просто чтобы обновить мой ответ. Самый простой способ получить ваш
Activity context
- это определитьstatic
экземпляр в вашемActivity
. НапримерА потом, в вашем
Task
,Dialog
,View
, вы можете использовать этот вид кода , чтобы получить вашиActivity context
:источник
R
). Люди из Google должны пополнить свой словарный запас.Это не проверено, и я правильно написал. но я передаю способ достичь того, что вы хотите.
Прежде всего создать и интерфейс
И реализовать это в любой деятельности.
и называть это как
источник
Context
. Как утверждает Непстер, лучше всего передавать обратный вызов, поэтому всякий раз, когда что-то случается, представляющее интерес для родителя, обратный вызов запускается с соответствующими данными.Контекстом может быть Приложение, Сервис, Активность и многое другое.
Обычно контекст Views в Activity - это сама Activity, поэтому вы можете подумать, что можете просто преобразовать этот Context в Activity, но на самом деле вы не всегда можете это сделать, потому что в этом случае контекст также может быть ContextThemeWrapper.
ContextThemeWrapper интенсивно используется в последних версиях AppCompat и Android (благодаря атрибуту android: theme в макетах), поэтому я бы лично никогда не выполнял это приведение.
Итак, короткий ответ: вы не можете надежно извлечь действие из контекста в представлении. Передайте Activity в представление, вызвав для него метод, который принимает Activity в качестве параметра.
источник
Никогда не используйте getApplicationContext () с представлениями.
Это всегда должен быть контекст деятельности, поскольку представление привязано к деятельности. Кроме того, у вас может быть набор пользовательских тем, и при использовании контекста приложения все темы будут потеряны. Узнайте больше о различных версиях контекстов здесь .
источник
А в Котлине
источник
Activity - это специализация Context, поэтому, если у вас есть Context, вы уже знаете, какую деятельность вы намереваетесь использовать, и можете просто привести a к c ; где a - это активность, а c - это контекст.
источник
Я использовал конвертировать активность
источник
Этот метод должен быть полезным ..!
Я надеюсь, что это помогает .. Веселое кодирование!
источник
как насчет живого обратного вызова данных,
источник