Sichtbarkeit und Modifizierer von Methoden

S

Speedy1985

Neues Mitglied
0
Hallo zusammen,

bin gerade am Anfang der Android/Java Programmierung und habe eine Verständnisfrage.

In der MainActivity habe ich ein Benutzerprofil deklariert mit:

public static Profile userProfile;

Natürlich gibt es auch eine entsprechende Klasse Profile mit diversen Eigenschaften.

In der onCreate-Methode wird das userProfile initialisiert:

userProfile = new Profile();

In der MainActivity gibt es eine Methode zum Speichern des User-Profils, die ich mit "public void ..." deklariert habe. Als Parameter übergebe ich ihr das userProfile, sowie einen Dateinamen zum Speichern.

In einer weiteren Activity, in der das userProfile bearbeitet wurde (geht ja, da es als public static gesetzt wurde), möchte ich nun wieder die Methode zum Speichern aus der MainActivity aufrufen. Ich habe es damit versucht:

MainActivity.saveProfile(userProfile,"userProfile");

Fehlermeldung: Non-static method saveProfile cannot be referenced by a static context

Deshalb habe ich die saveProfile-Methode als static deklariert.

Dann gibt es allerdings dieselbe Fehlermeldung, allerdings in der Methode "openFileOutput", die ich innerhalb der saveProfile-Methode benutze, um den outputStream zu initialisieren.

Was mach ich falsch, oder wie würdet ihr das behandeln?

Vielen Dank!

Gruß,
Christian
 
das erste was ich sagen möchte,bevor ich deine Frage beantworten werde, ist das du bei statischen Sachen in Activities aufpassen solltest...wenn die Activity gekillt wird dann machen deine statischen Sachen einfach *PUFF* und sind lost in den Abgründen des GC dreiecks,egal was du initialisiert hast , die sind einfach "null" und cnihtig.

Der ursprüngliche Beitrag von 21:27 Uhr wurde um 21:30 Uhr ergänzt:

Also für mcih sieht es aus als ob du aus einer statischen methode eine methode openFileOutput() aufrufst die ja eben nciht statisch ist sondern mit einem object zusammenhängt
 
Hallo Jaiel,

ja genau das ist das Problem.
Nur, wenn ich die Methode saveProfile als static deklariere, ist sie aus der anderen Aktivity sichtbar. Dann kann ich aber die Methode openFileOutput nicht mehr ausführen.

Wie würdest du ein solches Profil speichern, wenn nicht als statische Objekte?

Bin für jeden Tip dankbar!
 
darf ich deinen code sehen?

evtl ist deine herangehensweise auch nciht effizient du könntest ruhig mal kurz erklären was du genau erreichen willst.
 
Zur Kommunikation zwischen Activities solltest du keine statischen Attribute / Methoden verwenden, nur weil es leicht scheint. Zum Beispiel hast du ja bereits "gespürt", das du so auch auf nichts Zugriff hast, was einen Context benötigt.

Ein Lösungsvorschlag wäre z.B. startActivity / startActivityForResult zu verwenden. Dem Intent kannst du dann Daten mitgeben, z.B. das User Profil. Das Speichern eines Profils könntest du z.B. auch in eine eigene Klasse auslagern, ich nenn sie mal ProfileWriter.

Überall, wo du dann ein Profil speichern willst, erstellst du dir einen ProfileWriter und übergibst das Profil und einen Activity-Context (damit du Zugriff auf openFileOutput erhälst).

Das ist natürlich nur eine spontane Idee und nur eine von unzähligen Möglichkeiten, aber vielleicht hilfts als Idee ;)
 
Guten Abend an alle,

natürlich zeige ich euch auch gerne die relevanten Ausschnitte aus dem Code.

Also meine MainActivity sieht so aus:

Code:
 public class MainActivity extends Activity {
     public static Profile userProfile;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
         if(loadProfile("userProfile") != null){
            userProfile = loadProfile("userProfile");
        } else {
            userProfile = new Profile();
            saveProfile(userProfile, "userProfile");
        }
    }
     public void saveProfile(Profile profile, String fileName){
        OutputStream fos = null;
        try {
            fos = openFileOutput(fileName, MODE_PRIVATE);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(profile);
        }catch (IOException ioe){
            System.out.println(ioe.toString());
        }finally {
            try{
                fos.close();
            } catch (Exception e){
                System.out.println(e.toString());
            }
        }
     }
     public Profile loadProfile(String fileName){
        InputStream fis = null;
        Profile result = null;
         try{
            fis = openFileInput(fileName);
            ObjectInputStream ois = new ObjectInputStream(fis);
            result = (Profile) ois.readObject();
        }catch(IOException ioe){
            System.out.println(ioe.toString());
        }catch(ClassNotFoundException cnfe){
            System.out.println(cnfe.toString());
        }finally {
            try{
                fis.close();
            }catch(Exception e){
                System.out.println(e.toString());
            }
        }
        return result;
    }
}
Hier meine Profile-Klasse

Code:
 public class Profile implements Serializable {
     private int height = 180;
     private boolean stature = false;
     private int lightBlond = 0;
    private int darkBlond = 0;
    private int lightBrown = 0;
    private int darkBrown = 0;
    private int black = 0;
    private int red = 0;
    private int grey = 0;
    private int green = 0;
    private int purple = 0;
    private int blue = 0;
    private int turquoise = 0;
    private int pink = 0;
  
     // hier kommen noch die ganzen getter und setter
Auf dem MainActivity-Layout sind mehrere Buttons, über die ich auf Unteractivities gelange. Auf diesen Unteractivities kann ich das userProfile allerdings noch nicht ändern, sondern muss mich durch die Activities klicken, bis ich auf einer Activity bin, mit der ich beispielsweise die Haarfarbe einstellen kann.

Zum Einstellen der Haarfarbe bin ich auf der "HairColorActivity":

Code:
 public class HairColorActivity extends Activity {
     String meoryou;
     Button btn_haircolor_lightBlond;
    Button btn_haircolor_darkBlond;
    Button btn_haircolor_lightBrown;
    Button btn_haircolor_darkBrown;
    Button btn_haircolor_black;
    Button btn_haircolor_red;
    Button btn_haircolor_grey;
    Button btn_haircolor_green;
    Button btn_haircolor_purple;
    Button btn_haircolor_blue;
    Button btn_haircolor_turquoise;
    Button btn_haircolor_pink;

     @Override
 public void onCreate(Bundle savedInstanceState){
  super.onCreate(savedInstanceState);
  setContentView(R.layout.haircolor);
         final Bundle extras = getIntent().getExtras();
         if (extras != null){
            meoryou = extras.getString("meoryou");
            TextView txt_meoryou = (TextView) findViewById(R.id.txt_haircolor_meoryou);
            txt_meoryou.setText(meoryou);
        }
         btn_haircolor_lightBlond = (Button) findViewById(R.id.btn_haircolor_lightBlond);
        btn_haircolor_darkBlond = (Button) findViewById(R.id.btn_haircolor_darkBlond);
        btn_haircolor_lightBrown = (Button) findViewById(R.id.btn_haircolor_lightBrown);
        btn_haircolor_darkBrown = (Button) findViewById(R.id.btn_haircolor_darkBrown);
        btn_haircolor_black = (Button) findViewById(R.id.btn_haircolor_black);
        btn_haircolor_red = (Button) findViewById(R.id.btn_haircolor_red);
        btn_haircolor_grey = (Button) findViewById(R.id.btn_haircolor_grey);
        btn_haircolor_green = (Button) findViewById(R.id.btn_haircolor_green);
        btn_haircolor_purple = (Button) findViewById(R.id.btn_haircolor_purple);
        btn_haircolor_blue = (Button) findViewById(R.id.btn_haircolor_blue);
        btn_haircolor_turquoise = (Button) findViewById(R.id.btn_haircolor_turquoise);
        btn_haircolor_pink = (Button) findViewById(R.id.btn_haircolor_pink);
 }
  
         // Hier kommen noch die onClick-Ereignisse, die z.B. über
         MainActivity.userProfile.setLightBlond(1);
         // den Status dieser Variable setzen. Nach dem Setzen einer Variable soll jetzt das userProfile wieder gespeichert werden.
Wie gesagt, die Methode saveProfile aus der MainActivity ist nicht sichtbar, da sie nicht statisch ist.
Mache ich sie statisch, funktioniert die Methode openFileOutput nicht mehr.

Den Vorschlag mit der ProfileWriter-Klasse werde ich mal versuchen.

Vielen Dank soweit!:thumbup:

Gruß,
Christian
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
172
swa00
swa00
S
Antworten
0
Aufrufe
598
Sergio13
S
S
Antworten
17
Aufrufe
576
jogimuc
J
Zurück
Oben Unten