Klasse im selben Package aufrufen

G

Gast2

Gast
Hallo,

ich habe meine MainActivity.java und will darin eine zweite Java-Klasse "ZweiteKlasse.java" und die darin befindliche Methode "get.Info()" aufrufen, die ich zuvor erzeugt habe.

Im Manifest habe ich die neue Klasse eingebunden.
[XML]
<activity
android:name=".ZweiteKlasse"
android:label="@string/titel_info_geben">
</activity>[/XML]

Den Aufruf habe ich über den Klassennamen.Methode(); versucht
auch über com.example.namespace.Klassennamen.class.Methode();
und sonst umsonst rumprobiert.

Die ZweiteKlasse steht im Ordner "src" und F5 habe ich reichlich bedient.

WIE SPRECHE ICH DIE METHODE IN DER NACHBARKLASSE AN?
(Ich glaub ich hab'n Brett vor'm Kopp.) :oops:
 
N

nillehammer

Gast
Ist denn die Methode, die Du aufrufen willst, statisch? Ansonsten bräuchtest Du eine Instanz von ZweiteKlasse, um auf dieser die Methode aufzurufen
 
G

Gast2

Gast
Java:
ZweiteKlasse zk=new ZweiteKlasse();
zk.getInfo();

Es fiel mir wie Schuppen von den Augen... :applaus:

Aber aus irgendeinem Grund bekomme ich eine NullPointer Exception bei der Zuweisung:
Java:
zk=new ZweiteKlasse();
( in onCreate(..) )

Im Manifest habe ich wie oben gezeigt die Klasse eingepflegt.

Hat jemand eine Idee?
 

Trolok

Mitglied
versuch mal so udn sag ob ein Fehler auftaucht
Java:
public class MainActivity extends Activity {
         ZweiteKlasse zk=new ZweiteKlasse();
         public void onCreate(Bundle savedInstanceState) {
               [...]
         }
}
falls ja müsstest du die ZweiteKlasse posten
 
G

Gast2

Gast
falls ja müsstest du die ZweiteKlasse posten

JA, der Fehler tritt weiterhin auf.

Java:
package com.example.test;

import android.app.Activity;
import android.widget.TextView;

public class ZweiteKlasse extends Activity  {

	public TextView meinText = (TextView) findViewById(R.id.meinText);
	
	public void worteAendern (String neu){       
		meinText.setText("geändert");
	}

}

An der selben Stelle. Die eigentliche Methode worteAendern() habe ich noch gar nicht aufgerufen.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
> public TextView meinText = (TextView) findViewById(R.id.meinText)

schreibe nicht solche Code-Zeilen,
deklarierte Variablen werden noch vor dem Konstruktor initialisiert,
warum sollte findViewById() da schon funktionieren?
das ist doch bestimmt von zahlreichen Hintergrund-Initialisierungen abhängig,

> ZweiteKlasse zk=new ZweiteKlasse();
genauso


lasse ein Objekt erstmal mit leeren oder einfachen Konstruktor zur Ruhe kommen

---

bzw. das gehört anscheinend in onCreate(),
wenn diese Methode dran ist, kann man vielleicht von einen gewissen Initialisierungsstand ausgehen

hier habe ich gerade ein Beispiel gefunden, in welchem ein solchen Aufruf in onCreate() steht
https://github.com/Yelp/parcelgen/b.../src/com/yelp/parcelgen/BusinessActivity.java


gibt es eigentlich eine Fehlermeldung mit StackTrace?
je nach Ausführlichkeit könnte man erkennen ob der Fehler in findViewById() bzw. weiteren Untermethoden auftritt
 
G

Gast2

Gast
deklarierte Variablen werden noch vor dem Konstruktor initialisiert,
klar, habe ich auch probiert.

gibt es eigentlich eine Fehlermeldung mit StackTrace?
je nach Ausführlichkeit könnte man erkennen ob der Fehler in findViewById() bzw. weiteren Untermethoden auftritt

Ne, leider finde ich (in LogCat) nur fatal error und nullpointer axception als Hinweis.


Es hängt an der Zeile 11 in ZweiteKlasse.java, hier gibt es den Fehler.
Java:
meinText = (TextView) findViewById(R.id.meinText);


noch mal die Quelltexte:
MainActivity:
Java:
package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;

public class MainActivity extends Activity {
	
	ZweiteKlasse zk;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        zk = new ZweiteKlasse();
        zk.worteAendern("Neuer Text");
    }
}

ZweiteKlasse:
Java:
package com.example.test;

import android.app.Activity;
import android.widget.TextView;

public class ZweiteKlasse extends Activity  {

	public TextView meinText;
	
	public void worteAendern (String neu){      
		meinText = (TextView) findViewById(R.id.meinText);
		meinText.setText(neu);
	}
}

Ich könnte noch die LogCat -Daten kopieren, aber wie oben schon erwähnt finde ich(!) da nix weiter hilfreiches.

Warum läuft das Programm nicht durch?
 
S

SlaterB

Gast
was ist "R.id.meinText"?
gibt es sogar im Internet zu finden
Problem mit setText und Platzhalter in strings.xml - Android Forum - AndroidPIT

weißt du welcher Text das sein müsste, falls korrekterweise irgendwo definiert aber für dich bekannt?
setze dann direkt einen String "blahblah", immer noch Fehler?

------

darf man überhaupt Activity-Objekte einfach so selber erzeugen?
überschreibe onCreate(), logge Aufruf, wird von niemanden aufgerufen, oder?

wer erzeugt MainActivity? dort geht vielleicht findViewById(), da korrekt eingebunden,
in der zweiten losen Activity nicht

brauchst du eine zweite Activity? erstelle lieber leere einfache Klassen, übergib die erste für Framework-Aufrufe


-----

kannst du ein try/catch um "zk = new ZweiteKlasse();" setzen, die Exception abfangen und auf irgendeine Weise die Information des hoffentlich vorhandenen StackTraces extrahieren/ loggen?

die Welt fing mit System.out.println() an, da ging noch alles,
aber je höher man irgendwie kommt, mit komplizierten Frameworks/ Loggern, oder je tiefer man geht mit eingeschränkten APIs auf mobilen Geräten, desto weniger essentielles scheint manchmal zu laufen/ unter Kontrolle zu sein ;)

eine Programmausgabe ist DIE zentrale Programmfunktion überhaupt, wenn man die nicht selber bestimmt, kann man einpacken
 
Zuletzt bearbeitet von einem Moderator:

Trolok

Mitglied
folgendes funktioniert:
Java:
Activity

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        zk=new ZweiteKlasse();
        Button button=(Button) findViewById(R.id.button1);
        button.setOnClickListener(temp);       
        zk.worteAendern("TEST",this);
    }
Java:
ZweiteKlasse

import android.app.Activity;
import android.widget.TextView;
public class ZweiteKlasse   {
    public void worteAendern (String neu, Activity a){ 
    	TextView meinText = (TextView) a.findViewById(R.id.meinText);
    	meinText.setText(neu);
       
    }
}

Der gedanke ist MainActivity zu übergeben, dies kann man schon nach der erstellung von ZweiterKlasse machen:

Java:
in onCreate:
zk=new ZweiteKlasse();
zk.setActivity(this);

leider fand ich keine andere Lösung, generell (und ich hoffe ich werde berichtigt falls ich falsch liege) gehören Activity und deren .xml zusammen d.h es sollte nur eine Activity auf .xml Elemente zugreifen

ganzer code:
Java:
package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
	ZweiteKlasse zk;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        zk=new ZweiteKlasse();
        zk.setAct(this);
        Button button=(Button) findViewById(R.id.button1);
        button.setOnClickListener(temp);       

    }
    OnClickListener temp=new OnClickListener(){
    	public void onClick(View v){    		
    		zk.worteAendern("TEST");
    	}
    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    
}
Java:
package com.example.test;


import android.app.Activity;
import android.widget.TextView;
public class ZweiteKlasse   {
	Activity act;
	public void setAct(Activity temp){
		act=temp;
	}
    public void worteAendern (String neu){ 
    	TextView meinText = (TextView) act.findViewById(R.id.meinText);
    	meinText.setText(neu);
       
    }
}
 
Zuletzt bearbeitet:
S

SlaterB

Gast
@frankmehlhop
eine Zeile, das ist deine gesamte Reaktion auf zumindest zwei lange Posts?

nichts zur Klärung von 'R.id.meinText', funktioniert das etwa in der ersten Activity,
nichts zur Frage wozu zwei Activities,
nichts zum Logging von Fehlermeldung

kein neuer eigener Code oder irgendwas?
 
G

Gast2

Gast

schon bei der ersten Zeile
Java:
Resources res = getResources();
bekomme ich den selben Fehler.

weißt du welcher Text das sein müsste, falls korrekterweise irgendwo definiert aber für dich bekannt?
setze dann direkt einen String "blahblah", immer noch Fehler?

Nun ja, ich muss ja erst mal angeben, welchen TextView ich will. Und zwar den TextView meinText aus der XML. Bevor ich den Inhalt davon ändere, muss ich den Aufruf starten und der verursacht schon den Fehler.

darf man überhaupt Activity-Objekte einfach so selber erzeugen?
überschreibe onCreate(), logge Aufruf, wird von niemanden aufgerufen, oder?

Aber für Android kenne ich gar keine andere Möglichkeit als mit extends Activity zu arbeiten. Testweise habe ich es in der ZweitenKlasse rausgeschmissen und da kann nicht mehr auf die zugehörigen XML's zugegriffen werden.

onCreate() in ZweiteKlasse wird NICHT aufgerufen.

wer erzeugt MainActivity? dort geht vielleicht findViewById(), da korrekt eingebunden, in der zweiten losen Activity nicht

Die Frage wundert mich. Ich weiß nicht WER die MainActivity aufruft. Es ist die Startklasse in Android, so wie Main.java in Java (classic).
die Zeilen:
Java:
meinText = (TextView) findViewById(R.id.meinText);
meinText.setText(neu);
funktionieren übrigens in der MainActivity einwandfrei. Die XML's werden also gefunden.

brauchst du eine zweite Activity? erstelle lieber leere einfache Klassen, übergib die erste für Framework-Aufrufe
Wie meinst Du das? Ich habe doch im Prinzip eine zweite leere Klasse erstellt (ZweiteKlasse.java). Steht da irgend etwas überflüssiges drin?


kannst du ein try/catch um "zk = new ZweiteKlasse();" setzen, die Exception abfangen und auf irgendeine Weise die Information des hoffentlich vorhandenen StackTraces extrahieren/ loggen?
Na nu (sächsisch für "na klar"): java.lang.NullPointerException

Viel probiert und noch nicht weiter gekommen. ???:L
Ich will doch einfach nur lernen, eine zweite Klasse nutzen zu können.
In Java (classic) konnte ich das schon.
 

schlingel

Gesperrter Benutzer
Ich will doch einfach nur lernen, eine zweite Klasse nutzen zu können.

Habe ich das richtig verstanden? Du willst eine zweite Activity starten und dann ein Resultat von ihr zurückbekommen?

Wenn das zutrifft, machst du das falsch. Du müsstest hier startActivityForResult aufrufen und zwar mit einem Intent für eine ganz normale Activity. Diese muss nicht in den Code der MainActivity gepackt werden.

In der MainActivity baust du dann einfach die Methode onActivityResult ein und kannst das dann auch verarbeiten.

Odeeer willst du einfach nur eine normale Klasse verwenden? Die musst du nicht in's Manifest packen sondern einfach nur importieren.
 
S

SlaterB

Gast
Die Frage wundert mich. Ich weiß nicht WER die MainActivity aufruft. Es ist die Startklasse in Android, so wie Main.java in Java (classic).
das ist schon die gewünschte Erkenntnis, MainActivity ist kompliziert in ein Framework eingebunden,
welches von dieser Activity weiß,
du kannst nicht erwarten dass eine selber erstellte zweite Activity auch in allen Umfang funktioniert,
findViewById() macht, XMLs kennt usw.

aber davon ist ja inzwischen schon einiger Abstand genommen

die Zeilen:
Java:
meinText = (TextView) findViewById(R.id.meinText);
meinText.setText(neu);
funktionieren übrigens in der MainActivity einwandfrei. Die XML's werden also gefunden.
und in einer anderen Klasse sollen genau diese Aufrufe, genau bei diesem Activitiy-Objekt (welches ja übergeben wird) aufgerufen nicht mehr gehen? zum in etwa gleichen Zeitpunkt?
das erscheint wenig realistisch, widerspricht den Java-Grundsätzen

deswegen ist "Leider ohne Erfolg." zum Trolok-Code komisch,
verwendest du ihn genau so, welche Fehlermeldung, welche Code-Abweichung? usw.

Na nu (sächsisch für "na klar"): java.lang.NullPointerException
das ist nicht die vollständige Info, die man haben könnte,
mit StackTrace erkennt man, in welche Methode in welcher Tiefe der Fehler liegt,
ist 'R.id' schon null, scheitert findViewById() relativ hoch oder niedrig usw.

Code:
Exception in thread "main" java.lang.NullPointerException
	at test.Test.methode(Test.java:21)
	at test.Test.<init>(Test.java:16)
	at test.Test.main(Test.java:11)
bietet mehr
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Nun ja,
ich werde es für mich erst einmal so handhaben, dass ich Oberflächenrelevante Einstellungen in der MainActivity mache und nur Algorithmen u.Ä. auslagere. Das funktioniert problemlos.

Interessant wird das Thema spätestens wieder, wenn ich eine zweite Oberfläche anlege und dazu eine Klasse schreiben will / muss. Aber darum kümmere ich mich, wenn es so weit ist.

Danke für Euer aller Hilfe.
Noch ein kurzes Wort zum Schlingel: Das was Du mir geschrieben hast überstieg mein Niveau um mindestens 2 Level und das ist mindestens 1 Level zu viel. ;)

Frank
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Was fehlt mir hier für diese Klasse? ich habe es mit (>>> ... <<<) markiert. Android & Cross-Platform Mobile Apps 4
W aus Fragmente in andere Klasse wechseln mit Button Android & Cross-Platform Mobile Apps 3
J Android Datenbank Klasse nur für CRUD-Operation, oder auch mehr ? Android & Cross-Platform Mobile Apps 8
H Android Aufrufen von "setContentView" in einer anderen Klasse Android & Cross-Platform Mobile Apps 3
ms_cikar Thread / Intent als externe klasse Android & Cross-Platform Mobile Apps 1
S Android CheckBox Status von anderer Klasse aus ändern Android & Cross-Platform Mobile Apps 4
M Android Switch-Klasse stoppt Android App / java.lang.NullPointerException Android & Cross-Platform Mobile Apps 5
C Auf innere (Thread)Klasse zugreifen, von anderer Klasse aus Android & Cross-Platform Mobile Apps 3
A Fehler beim Starten eines Intents - alles in einer Klasse funktioniert... Android & Cross-Platform Mobile Apps 4
A Kann nicht in TextView einer anderen Klasse schreiben - wieso? Android & Cross-Platform Mobile Apps 9
J Java ME Canvas Klasse Gameloop und Funktion Android & Cross-Platform Mobile Apps 2
M Wie in einer anderen "nicht canvas" klasse zeichne Android & Cross-Platform Mobile Apps 5
D Android selben Service mehrmals Aufrufen Android & Cross-Platform Mobile Apps 17
G Randomgenerator liefert immer wieder die selben Zahlen Android & Cross-Platform Mobile Apps 16
W Bluetooth und obex Package nutzen Android & Cross-Platform Mobile Apps 4
E Java ME package java.sql does not exist? Android & Cross-Platform Mobile Apps 2
D Package importieren Android & Cross-Platform Mobile Apps 3
M JDBC optional package. Wie installieren? Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben