null-Zeiger-Ausnahme auf calling interface implementierte Methode in einer anderen Klasse
Ich versuche, rufen Sie die Methode getFailureDialog()
von der Schnittstelle OnSelectedListener
.
Die Methode ist implementiert in MainActivity.java
. Aber wenn ich die Methode aufrufen kann, bin ich immer
die null-Zeiger-Ausnahme.
Ich weiß, dass es ist, weil OnSelectedListener
ist noch nicht initialisiert und Sie sind dem Aufruf getFailureDialog()
auf nicht initialisierte Objekt. Offensichtlich, interface-Methoden sind nie initialisiert. Aber wie rufe ich die Methode getFailureDialog()
aus meiner Klasse Common.java
?
Ich bin dabei nur der relevante Quellcode unten-
Source code:
SharedFragment.java
public class SharedFragment extends DialogFragment
{
Bundle bundle = getArguments();
final String email = bundle.getString("email");
Thread t=new Thread(new Runnable()
{
public void run() {
common.myRecord(email);
}
}); t.start();
}
Common.java
public class Common
{
OnSelectedListener mCallback;
public interface OnSelectedListener
{
public void getFailureDialog();
}
public void myRecord(String email)
{
mCallback.getFailureDialog(); //null pointer exception here
}
}
MainActivity.java
public class MainActivity implements Common.OnSelectedListener
{
@Override
public void getFailureDialog()
{
RecordFailure fd = new RecordFailure();
fd.show(getSupportFragmentManager(), "dialog");
}
}
Fehlerprotokoll
03-22 15:50:39.032: W/dalvikvm(20796): threadid=16: thread exiting with uncaught exception (group=0x4204c450)
03-22 15:50:39.052: E/AndroidRuntime(20796): FATAL EXCEPTION: Thread-30126
03-22 15:50:39.052: E/AndroidRuntime(20796): java.lang.NullPointerException
03-22 15:50:39.052: E/AndroidRuntime(20796): at com.cornmail.util.Common.myRecord(Common.java:2062)
InformationsquelleAutor My God | 2013-03-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
wird nie initialisiert, oder der Initialisierung mit einem null-Wert.
Sie kann die Initialisierung der Schnittstelle, was für eine schlechte Antwort
sicher, Sie können. Nur zum Beispiel, verwenden Sie die neue Ansicht.OnClickListener und ovveride die onClick () - Methode. Dies ist nicht der Prozeß der "Initialisierung" im herkömmlichen Sinn, aber ich denke, dass Kylar hat nur verallgemeinert, dass
ich habe nie gefunden, interface-design wie das so meine Erfahrung. Schnittstelle umgesetzt werden sollen 1. in einer anderen Klasse, bevor es verwendet wird, von einer anderen Klasse
Dann haben Sie nicht genug Erfahrung. Initialisieren anonymen interface-Implementierungen ist sehr sehr Häufig im Gange.
InformationsquelleAutor Kylar
hier ist der Quellcode für die
OnSelectedListener
. Denn das ist eine Schnittstelle, Sie haben die Initialisierung mithilfe neue und überschreiben deronSelected()
Methode ODER lassen Sie Ihre Klasse implementieren dieser listenerInformationsquelleAutor Droidman
fügen Sie eine Methode in
verwenden nun die
setOnSelectedListener()
initialisieren Sie Ihre Zuhöreraber von Ihnen-code, den Sie eventuell benötigen, um zu implementieren ein weiterer listener in Ihrem
SharedFragment
zu.InformationsquelleAutor Naveen
Haben Sie umgestalten code Mann, machen Gemeinsame Klasse implementieren
OnSelectedListener
- Schnittstelle. So trennenOnSelectedListener
als äußere Schnittstelle nicht als innere Schnittstelle.werde ich code es so.
dann
Common
Klasse sollte wie folgt seinund dieser code läuft reibungslos.
wenn Sie brauchen, um zu implementieren, die getFailureDialog in der MainActivity sind, machen diese Gemeinsame Klasse als abstrakte Klasse.
Gemeinsame Klasse wird wie dieses
nun Ihre
MainActivity
Klasse erweitern zu können, von dieser Klasse zu implementieren, das fehlende Teil.Allgemeine Klasse ist die Klasse, die enthält rund 2000 Zeilen code mit vielen Methoden umgesetzt. Es kann nicht Abstrakt sein.
können darauf warten, dass andere dann Antworten, denn ich würde mein code wie folgt. Warum u tun haben, zu entwerfen, einen solchen Mechanismus, wie diese? Ist es der API-Bibliothek, die codiert, wie diese, geben Sie mir einige zeigen. Ich werde lieben, etwas Forschung zu tun. Abstrakte Klasse kann implementiert haben Methode, aber es kann instanziiert werden. Haben Sie jemals verwenden abstrakte Klasse vor?
die Hauptidee der Verwendung solcher Mechanismus ist, dass - es gibt viele Schnittstellen in der gesamten Anwendung mit nur wenigen Methoden. So seine umständlich zum erstellen von Klassen für jedes interface mit so einen kleinen code. Setzen Sie innerhalb einer Klasse ist die bessere Idee und empfohlen wurde.
der andere Grund ist - ich habe alle implementierten Methoden jeder Schnittstelle in einer einzigen Klasse, die MainActivity.java so, es ist einfach zu wissen, dass die implementierten Methoden zu dieser Klasse gehören, und Sie haben nicht zu suchen jedes mal, wo ist die Implementierung einer Methode der Schnittstelle.
InformationsquelleAutor Dion Dirza
Müssen Sie ändern Häufig und MainActivity. Gemeinsam fügen Sie ein basic-Konstruktor. Dann aktivieren Sie den Rückruf, wie gezeigt, in startMyCallback.
Common.java
MainActivity.java
InformationsquelleAutor MoleIsKing