Dieser hat mich verblüfft.
Ich muss eine Aktivitätsmethode aus einer benutzerdefinierten Layoutklasse heraus aufrufen. Das Problem dabei ist, dass ich nicht weiß, wie ich über das Layout auf die Aktivität zugreifen kann.
Profilansicht
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);
}
}
Wie Sie oben sehen können, instanziiere ich die profileView programmgesteuert und übergebe damit den activityContext. 2 Fragen:
- Übergebe ich den richtigen Kontext in die Profilansicht?
- Wie erhalte ich die enthaltende Aktivität aus dem Kontext?
Dies ist etwas, in das ich erfolgreich konvertiert habe
Context
,Activity
wenn ich innerhalb der Benutzeroberfläche in Fragmenten oder benutzerdefinierten Ansichten arbeite. Es entpackt ContextWrapper rekursiv oder gibt null zurück, wenn es fehlschlägt.quelle
In Android gibt es zwei verschiedene Kontexte. Eine für Ihre Anwendung (nennen wir sie die GROSSE) und eine für jede Ansicht (nennen wir sie den Aktivitätskontext).
Ein lineares Layout ist eine Ansicht, daher müssen Sie den Aktivitätskontext aufrufen. Um es von einer Aktivität aus aufzurufen, rufen Sie einfach "this" auf. So einfach ist es nicht?
Wenn Sie verwenden
Sie rufen den BIG-Kontext auf, der Ihre Anwendung beschreibt und Ihre Ansicht nicht verwalten kann.
Ein großes Problem mit Android ist, dass ein Kontext Ihre Aktivität nicht aufrufen kann. Das ist eine große Sache, um dies zu vermeiden, wenn jemand mit der Android-Entwicklung beginnt. Sie müssen einen besseren Weg finden, um Ihre Klasse zu codieren (oder "Kontextkontext" durch "Aktivitätsaktivität" ersetzen und bei Bedarf in "Kontext" umwandeln).
Grüße.
Nur um meine Antwort zu aktualisieren. Der einfachste Weg, um Ihre zu erhalten,
Activity context
besteht darin, einestatic
Instanz in Ihrer zu definierenActivity
. BeispielsweiseUnd dann, in der
Task
,Dialog
,View
, können Sie diese Art von Code verwenden , um Ihre zu erhaltenActivity context
:quelle
R
). Die Google-Leute müssen ihren Wortschatz erweitern.Es ist ungetestet und ich habe es richtig codiert. Aber ich vermittle einen Weg, um das zu erreichen, was Sie wollen.
Zunächst erstellen und Schnittstelle
Und implementieren Sie dies für jede Aktivität.
und nenne es wie
quelle
Context
. Wie Nepster feststellt, besteht die beste Vorgehensweise darin, einen Rückruf weiterzuleiten. Wenn also etwas passiert, das für die Eltern von Interesse ist, wird der Rückruf mit den relevanten Daten ausgelöst.Der Kontext kann eine Anwendung, ein Dienst, eine Aktivität und mehr sein.
Normalerweise ist der Kontext von Ansichten in einer Aktivität die Aktivität selbst, sodass Sie vielleicht denken, Sie können diesen Kontext einfach in Aktivität umwandeln, aber tatsächlich können Sie dies nicht immer tun, da der Kontext in diesem Fall auch ein ContextThemeWrapper sein kann.
ContextThemeWrapper wird in den neuesten Versionen von AppCompat und Android häufig verwendet (dank des Attributs android: theme in Layouts), daher würde ich diese Besetzung persönlich niemals durchführen.
Die kurze Antwort lautet: Sie können eine Aktivität nicht zuverlässig aus einem Kontext in einer Ansicht abrufen. Übergeben Sie die Aktivität an die Ansicht, indem Sie eine Methode aufrufen, die die Aktivität als Parameter verwendet.
quelle
Verwenden Sie niemals getApplicationContext () mit Ansichten.
Es sollte immer der Kontext der Aktivität sein, da die Ansicht an die Aktivität angehängt ist. Möglicherweise haben Sie auch ein benutzerdefiniertes Themenset, und wenn Sie den Kontext der Anwendung verwenden, gehen alle Themen verloren. Lesen Sie mehr über verschiedene Versionen von Kontexten hier .
quelle
Und in Kotlin:
quelle
Eine Aktivität ist eine Spezialisierung der Kontext so, wenn Sie einen Kontext haben Sie bereits wissen , welche Aktivität Sie verwenden möchten , und können einfach werfen ein in c ; wo eine ist eine Tätigkeit , und c ist ein Context.
quelle
Ich habe Konvertierungsaktivität verwendet
quelle
Diese Methode sollte hilfreich sein ..!
Ich hoffe das hilft .. Frohe Codierung!
quelle
Wie wäre es mit einem Live-Datenrückruf?
quelle