Java Klassen

-H-T-P-

Mitglied
Hallo,

bin in Java ziemlicher Anfänger und hätte da folgende Frage:
Speziell geht es um das Android SDK.
In ein Packet habe ich 2 Java-Dateien, in jeder davon ist eine Klasse.
In der Ersten kann ich auf die UI-Elemente zugreifen, in der Zweiten nicht.
Außerdem ist die Erste Klasse/Java-Datei das Hauptprogramm und die Zweite der Service dazu, der vom Hauptprogramm aufgerufen wird.

Wie kann ich also UI-Elemente, oder auch alles andere bei jeder Klasse/Java-Datei nutzen?
Dachte immer das es mit "public......." geht.


Hoffe, dass ich es einigermaßen erklären konnte. ;)
Leider ist mir kein besserer Titel eigefallen.
 
Hi, so wie du es sagst stimmt es schon auf public Elemente kann man von überall drauf zu greifen.
Hilfreich wären jetzt zum Einen Ausschnitte aus deinem Code und auch eine genau Beschreibung, was er denn nicht macht. Also bekommst du einen Fehler und wenn ja was für einen?
Ich vermute, dass die Klasse deines Hauptprogramms von der Klasse der UI-Elemente abgeleitet wird(Vererbung) und dadurch die Attribute und Methoden der UI-Klasse erbt und du dadurch darauf zugreifen kannst.
Wie gesagt, am besten wäre eine genauere Beschreibung und der entsprechende Code.
 
Leider habe ich wieder ein Problem.
Das zuvor geschriebene Programm das auch wirklich funktioniert hat, tut dies nicht mehr. Einfach so, ohne irgendwelche Meldungen etc.
Vielleicht find ich den Fehler und kann dann den Code morgen posten.
Das Programm sollte einen Service starten und dann in gewissen Abständen auf die UI-Elemente zugreifen.

Aber jetzt zu dem eigentlichen Problem.
Wenn ich jetzt z.B. in der Klasse das schreibe: "public String TestString="Test";" müsste ich es doch einfach in der Anderen verwenden können, oder?
Nur als Beispiel jetzt, müsste doch ungefähr das selbe Prinzip sein wie die Verwendung der UI.
 
Moin,

Aber jetzt zu dem eigentlichen Problem.
Wenn ich jetzt z.B. in der Klasse das schreibe: "public String TestString="Test";" müsste ich es doch einfach in der Anderen verwenden können, oder?
Nur als Beispiel jetzt, müsste doch ungefähr das selbe Prinzip sein wie die Verwendung der UI

ich hoffe, Deine Frage richtig verstanden zu haben ...

So etwas wie (in vereinfachter Darstellung)
Java:
public void myClassA()
{
...
    public String TestString = "Test";
...
}
// -------
package myClassA()
public void myClassB()
{
    myClassA.TestString = "neuer Test";
}
geht immer ;)

Gruß
Klaus
 
Geht immer?
Geht es auch, wenn die 2 Klassen in unterschiedlichen Dateien sind?
Bei mir nicht.

Wenn ich jetzt "package MeineKlasse" eingebe, sagt er "Syntax error on tocken "package", import expected".
Importiert habe ich das doch schon.

Aber wenn die Klasse nicht vorhaden sein sollte, dann dürfte auch die Codevervollständigung nicht gehen, oder?
Die geht aber, zeigt nur nicht den String oder Sonstiges an.

Hier ist ein Beispiel, ohne irgendwelche Veränderungen. So wie er da ist bekomme ich keine Fehler.

Java:
package de.service.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

public class ServiceTest extends Activity {
    /** Called when the activity is first created. */
	public String TestString="Service gestartet";
   
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startService(new Intent(ServiceTest.this,
                ServiceTest.class));
    }
}

Java:
package de.service.test;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;

public class TestService extends Service {
	private final IBinder mBinder = new LocalBinder();
	
    public class LocalBinder extends Binder {
    	TestService getService() {
            return TestService.this;
        }
    }
    
    public void onCreate() {
    	Toast.makeText(this, "Der String z.B. hier einfügen", Toast.LENGTH_SHORT).show();
    }

    public IBinder onBind(Intent intent) {
        return mBinder;
    }
}
 
Moin,

sorry, das war ich wohl etwas zu schnell (war VHIDT :))

Eigentlich sollten die Zeilen 7 und 8 andeuten, dass es unterschiedliche Dateien (ggf. natürlich auch in unterschiedlichen packages) sind ...
Du musst das gewünschte Klasse halt nur dort, wo Du sie verwenden willst, importieren!

Gruß
Klaus
 
Hi!
Vielleicht solltest du mal konrekt das Beispiel posten, in dem der Fehler auftritt?

*grüssle*
 
Sorry, dass das so lange gedauert hat.

Vielleicht solltest du mal konrekt das Beispiel posten, in dem der Fehler auftritt?
Dachte das hätte ich?

OK. Noch genauer.
Jetzt habe ich zum Spass mal den Code umgeändert, wie es mir vfl_freak gesagt hat.
Geändert hat sich nun der 2.Teil, also der Service:

Java:
package de.service.test;
package ServiceTest;             //Fehler 1

import android.content.Intent;
import android.app.Service;
import android.os.Binder;
import android.os.IBinder;
import android.widget.Toast;

public class TestService extends Service {
	
    public class LocalBinder extends Binder {
    	TestService getService() {
            return TestService.this;
        }
    }
    
    public void onCreate() {
    	Toast.makeText(this, ServiceTest.TestString, Toast.LENGTH_SHORT).show();    //Fehler 2
    }

    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    
    private final IBinder mBinder = new LocalBinder();
}

Ich verstehe zwar nicht wieso ich nochmal "package ServiceTest" reinschreiben soll, wenn alles schon da ist, aber nun gut.

Nun die konkreten Fehler, so wie es mir Eclipse sagt:
Fehler 1: The declared package "ServiceTest" does not match the expected package "de.service.test"
Fehler 2: Cannot make a static reference to the non-static field ServiceTest.TestString. (ServiceTest.TestString ist rot unterringelt).
 
Moin!
Hier ist ein Beispiel, ohne irgendwelche Veränderungen. So wie er da ist bekomme ich keine Fehler.
Nun nach dieser Aussage hatte ich dich so verstanden, dass der von dir gepostete Code bei dir funktionieren würde.

Also, Paketdeklarationen:
Wenn deine öffentliche Klasse "TestService" beispielsweise im Paket "de.service.test", bedeutet dies, die Datei TestService muss sich in einer Orderstruktur "/xyz/de/service/test" befinden. Tut sie das? Die Angabe "package ServiceTest;" ist dann wahrscheinlich mal falsch. Hat auch niemand behauptet, dass du dies dazuschreiben solltest. VFL_Freak sagte nur, du sollst die Klasse gegebenenfalls importieren.


Dein zweiter Fehler:
Der String TestService ist in deiner Klasse ServiceTest nicht statisch, wie die Fehlermeldung schon schön sagt. Entweder deklararierst du den String als statische Variable, oder du musst dir erst eine Instanz der Klasse ServiceTest erstellen und kannst dann auf die Variable zugreifen....

*grüssle*
 
Zuletzt bearbeitet:
Zurück