Methode aus einer anderen Activity verwenden

  • Antworten:3
  • Bentwortet
Robbiani Renato
  • Forum-Beiträge: 602

24.09.2019, 16:58:26 via Website

Hallo zusammen

In einer Activity hole ich die Daten aus dem Speicher.

public List<Ort> out_data(){
    List<Ort> orte = new ArrayList<Ort>();
    Set<String> str_name = new HashSet<String>();
    Set<String> str_breit = new HashSet<String>();
    Set<String> str_lang = new HashSet<String>();
    Ort pool = new Ort();
    String[] arr_name = new String[MAX];
    String[] arr_breit = new String[MAX];
    String[] arr_lang = new String[MAX];

    SharedPreferences pref = getSharedPreferences(APP, 0);
    str_name = pref.getStringSet("ORTNAME", null);
    str_breit = pref.getStringSet("ORTBREIT", null);
    str_lang = pref.getStringSet("ORTLANG", null);
    if( str_name != null ) {
        i = 0;
        for(Object name : str_name.toArray()){
            arr_name[i] = (String) name;
            i++;
        }
    }
    if( str_breit != null) {
        i = 0;
        for(Object breit : str_breit.toArray()){
            arr_breit[i] = (String) breit;
            i++;
        }
    }
    if( str_lang != null ) {
        i = 0;
        for(Object lang : str_lang.toArray()){
            arr_lang[i] = (String) lang;
            i++;
        }
    }
    if((arr_name != null) && (arr_breit != null) && (arr_lang != null)) {
        for (int x = 0; x < i; x++) {
            pool.name = arr_name[x];
            pool.breite = Double.parseDouble(arr_breit[x]);
            pool.laenge = Double.parseDouble(arr_lang[x]);
            orte.add(pool);
        }
    }

    return orte;
}

In einer weiteren Activity möchte ich dasselbe tun. Darum greife ich auf diese Methode zu

orte = (SaveActivity.Ort) SaveActivity.out_data();

Doch nun wird der Name "out_data()" rot untermalt mit der Fehlermeldung, ich soll die Methode static machen. Mache ich die Methode aber static, so hat das weit reichende Konsequenzen da der Compiler nun auch alle verwendeten Variablen static haben möchte.

Was kann ich machen um das static zu umgehen?

Gruss Renato

Kommentieren
Beste Antwort
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

24.09.2019, 17:14:29 via Website

Hallo Renato,

am besten du lagerst das in eine Klasse aus und rufst diese aus den Activities mit Context Parameter für die Prefs auf. Dann hast du dieses Problem nicht mehr.
Oder du machst es static mit Parameter, läuft aus selbe hinaus, 1. ist aber besser.

— geändert am 24.09.2019, 17:15:18

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 602

25.09.2019, 10:45:07 via Website

Ciao Pascal

Herzlichen Dank für deine Antwort.
Ich stehe an einem Problem an und zu allem habe ich noch eine Frage.

Das Problem:
In der Klasse will er die Methode "getSharedPreferences" nicht kennen. Ich gehe davon aus, dass dies mit dem Context zusammenhängt. Obwohl ich den Import mache will er diese Methode nicht kennen.

import android.content.SharedPreferences;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import android.content.Context;
import android.content.SharedPreferences;

import ch.robbisoft.sun_app.SaveActivity;

public class Speicher {

public static final String APP = "SONNE";
public static final int MAX = 50;

private int i; //Zähler für die Anzahl der Einträge

/**********************************************************************************************
 * Speichert die Liste der Standorte
 *
 * @author robbisoft  @since 12. September 2019
 * @param Liste der Standorte
 * @return
 * @exception
 * @throws
 **********************************************************************************************/
public void in_data( List<Ort> orte ){
    Set<String> str_name = new HashSet<String>();
    Set<String> str_breit = new HashSet<String>();
    Set<String> str_lang = new HashSet<String>();
    SharedPreferences pref = getSharedPreferences(APP, 0);
    SharedPreferences.Editor editor = pref.edit();
    //Auslesen und Sets aufbauen
    for(Ort inhalt : orte){
        str_name.add(inhalt.name);
        str_breit.add(Double.toString(inhalt.breite));
        str_lang.add(Double.toString(inhalt.laenge));
    }
    editor.putStringSet("ORTNAME", str_name);
    editor.putStringSet("ORTBREIT", str_breit);
    editor.putStringSet("ORTLANG", str_lang);
    editor.commit();
}

/**********************************************************************************************
 * Lät die Liste der Orte
 *
 * @author robbisoft  @since 23. September 2019
 * @param
 * @return Liste der Orte
 * @exception
 * @throws
 **********************************************************************************************/
public List<Ort> out_data(){
    List<Ort> orte = new ArrayList<Ort>();
    Set<String> str_name = new HashSet<String>();
    Set<String> str_breit = new HashSet<String>();
    Set<String> str_lang = new HashSet<String>();
    Ort pool = new Ort();
    String[] arr_name = new String[MAX];
    String[] arr_breit = new String[MAX];
    String[] arr_lang = new String[MAX];

    SharedPreferences pref = getSharedPreferences(APP, 0);
    str_name = pref.getStringSet("ORTNAME", null);
    str_breit = pref.getStringSet("ORTBREIT", null);
    str_lang = pref.getStringSet("ORTLANG", null);
    if( str_name != null ) {
        i = 0;
        for(Object name : str_name.toArray()){
            arr_name[i] = (String) name;
            i++;
        }
    }
    if( str_breit != null) {
        i = 0;
        for(Object breit : str_breit.toArray()){
            arr_breit[i] = (String) breit;
            i++;
        }
    }
    if( str_lang != null ) {
        i = 0;
        for(Object lang : str_lang.toArray()){
            arr_lang[i] = (String) lang;
            i++;
        }
    }
    if((arr_name != null) && (arr_breit != null) && (arr_lang != null)) {
        for (int x = 0; x < i; x++) {
            pool.name = arr_name[x];
            pool.breite = Double.parseDouble(arr_breit[x]);
            pool.laenge = Double.parseDouble(arr_lang[x]);
            orte.add(pool);
        }
    }

    return orte;
}

public class Ort{
    Double breite;
    Double laenge;
    String name;
}

}

Wie genau muss ich vorgehen, damit es funktioniert?

Zur Frage:
Muss ich dann die neue Klasse mit "Speicher speicher = new Speicher();" anlegen und dann verwenden oder kann ich sie mit einem Import reinholen?

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.527

25.09.2019, 11:10:19 via Website

Hallo
Erstmal solltest du eine Klassenvariable vom Typ "Context" erstellen.

Dann solltest du in der Klasse "Speichern" einen Konstruktor erstellen den du den Kontext der Activity übergibst. In ihm speicherst du den Kontext der Activity in der Variablen.

Nun kannst du auch mit Hilfe der Context Variablen auf deine Pref zugreifen.

Context context; // Klassen Rumpf

public Speicher(Context context){
this.context = context;
}

In der Methode

SharedPreferences pref = context.getSharedPreferences(APP, 0);

Muss ich dann die neue Klasse mit "Speicher speicher = new Speicher();" anlegen

Ja aber mit dem Context der Activity in der onCreate zb.
Speicher speicher = new Speicher(this);

Eine weitere Möglichkeit ist den Context immer der Methode auch mit zugeben.
Und diesen bei den Pref zubenutzen.

public void in_data( List orte , Context context){

SharedPreferences pref = context.getSharedPreferences(APP, 0);

}

Hier brauchst du aber auch eine Instanz (objekt) der Klasse in der Activity

— geändert am 25.09.2019, 11:26:45

Hilfreich?
Robbiani Renato
Kommentieren