2010-11-29 19 views
0

Ich habe eine Anwendung mit mehreren Aktivitäten. In der Hauptklasse öffne ich eine Datenbank und eine Liste der Inhalte erstellen, wie so:Android Form als Aktivität

public class MyApplication extends Activity 
{ 
    private List<PhoneNumber> numberList; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     ... 
     numberList = new ArrayList<PhoneNumber>(); 
     ... 
     loadDatabase() 
     ... 
    } 

    private void loadDatabase() 
    { 
     // File IO and parsing stuff 
     addNumber(thisNumber); // executes for each entry 
    } 

    public void addNumber(PhoneNumber thisNumber) 
    { 
     numberList.add(thisNumber); 
    } 
} 

Dies funktioniert gut, und ich habe eine Listview in der Haupttätigkeit, die mit diesen Daten gefüllt wird. Jetzt geht es weiter zum nächsten Schritt. Ich versuche ein Formular als neue Aktivität zu starten, die einen Eintrag zu dieser Liste hinzufügen wird. Die Aktivität startet gut und ich konnte problemlos ein Formular erstellen. Das Problem besteht darin, auf die Liste zuzugreifen, um sie hinzuzufügen.

public class AddNumber extends Activity 
{ 
    ... 
    // This function is called from the done button 
    // <Button android:text="Done" android:onClick="formDone"/> 
    public void formDone(View v) 
    { 
     // findViewByIds here to get data from form. 
     // This is done correctly and I can see my data in memory 

     MyApplication access = new MyApplication(); 
     PhoneNumber newNumber = new PhoneNumber(); 

     // Fill newNumber object with data from form. Done correctly. Verified 

     access.addNumber(newNumber); 
    } 

Die letzte Zeile von formDone() wird ordnungsgemäß ausgeführt. Durch das Debugging kann ich zur Application-Klasse wechseln und sie führt addNumber() aus. Bevor ich numberList.add(thisNumber); ausführe, kann ich den Inhalt des Speichers für das thisNumber Objekt betrachten, das versucht wird, der Liste hinzuzufügen, und diese Daten sind korrekt. Der Versuch, diese Zeile auszuführen, stürzt die Anwendung jedoch im Standard-Android-Format ab. (Lädt View.class mit 'Source not found' gefolgt von ZygoteInit $ MethodBlahBlah).

So bin ich ein wenig verwirrt, weil es aussieht, als ob die Daten addNumber() korrekt ist, und die Funktion funktioniert einwandfrei, wenn die Anwendung zum ersten Mal durch Erstellen der Liste aus den Daten in der Datenbank startet. Grundsätzlich denke ich darüber nach, richtig? Sollte eine Form wie diese eigene Aktivität sein oder gibt es einen besseren Weg? Wenn es seine eigene Aktivität sein kann, was mache ich falsch?

Danke,
Nate

+1

Ich habe keine Ahnung, was Sie tun, aber 'Anwendungszugriff = neue Anwendung();' ist nie * in einer Anwendung gültig. * Ok vielleicht unter bestimmten Umständen, aber nicht hier. – Falmarri

+0

Ich habe die Klassen und Objekte umbenannt, damit sie mit der Menge an Code, die ich gepostet habe, Sinn ergeben würden. Vielleicht habe ich keine gute Arbeit geleistet ... "Bewerbung" bezieht sich nur auf die Hauptklasse. Ich erstelle ein Objekt der Hauptklasse, um auf seine Mitgliedsfunktionen zuzugreifen. Wie ist das nicht gültig? Wie sonst würde ich auf die private Liste zugreifen? – linsek

Antwort

1

Wie Falmarri darauf hingewiesen, ist es nicht gültig eine Anwendung oder ein Aktivitätsklasse direkt zu instanziieren.

Stattdessen haben Sie zwei primäre Optionen für die Kommunikation zwischen Aktivitäten.

  1. Informationen über den Intent übergeben. Fügen Sie die Telefonnummernliste als Zusatz zu der Absicht hinzu, die AddNumber startet, und geben Sie die geänderte Liste zurück, wenn Sie fertig sind.

  2. Informationen in einer benutzerdefinierten Anwendung speichern. Erweitern Sie die Application-Klasse (wählen Sie sie als Ihre Application-Klasse im Manifest aus). Speichern Sie Ihre Nummernliste dort. Sie können von jeder Aktivität aus über getApplication() auf die Anwendungsklasse zugreifen. Übergeben Sie es einfach an Ihre Anwendungsklasse und greifen Sie auf die Methode zu.

+0

Danke für die Hilfe. Ich wechselte von startActivity zu startActivityForResult und konnte die Daten an die Hauptanwendung zurückgeben, um sie der Liste hinzuzufügen. – linsek

1

Warum so arbeiten? Ich denke, es ist besser, startActivityForResult anstelle von nur startActivity von Ihrer MyApplication Klasse zu verwenden.

https://developer.android.com/reference/android/app/Activity.html

Es ist besser, es auf diese Weise zu verwenden, da die für das Gedächtnis Gründe kennen, könnte Ihre Ausgangsaktivität wieder aufgebaut danach bekommen zerstört und was dann zu Ihrem Rückruf geschieht? Unterschätzen Sie nicht die Macht der Absichten.