Seperate PrefReferences.java erstellen möglich?

  • Antworten:16
Volkan Aydin
  • Forum-Beiträge: 187

03.06.2014, 22:38:59 via Website

Mein Ziel. Ich möchte eine seite.java erstellen zum "Cookies" erstellen. ich möchte von sämtlichen Activitys nachher da zugreifen und die werte abrufen.....

Mei ergebnis sieht so aus:

SavePreference.java

public class SavePreferences extends Activity {     
        private final String PREFS_NAME = "cookies";

public String viewP(String name){       
    String cookie = getSharedPreferences(PREFS_NAME, MODE_PRIVATE).getString(name,null);
    return cookie;
}

public boolean setP(String name,String value){      
    if  (getSharedPreferences(PREFS_NAME , MODE_PRIVATE).edit().putString(name, value).commit()){
        return true;    
    }else{
        return false;
    }   
}

}

in meiner Hauptactivity

private SavePreferences sp;

...

sp = new SavePreferences();

...

 if(sp.viewP("CBsave") != null){
        bn.setText(sp.viewP("CBsave"));
        Log.i("bnText","= "+ sp.viewP("CBsave"));
        bn.setVisibility(View.GONE);    
}

Ich kapiere das extends Activity wohl das Problem ist.... was muss da rein? :)
wenn ich extends Activity auslase funktioniert MODE_PRIVATE nicht...? Weshalb?

Step by Step..... :D

Antworten
Jonathan
  • Forum-Beiträge: 16

04.06.2014, 00:05:54 via Website

Hmm, überleg doch mal :D Also wenn du "extends Activity" machst, heißt das, dass deine Klasse von Activity erbt. Also auch alle Variablen(/Konstanten). Wenn du "extends Activity" weglässt, musst du einfach statt "MODE_PRIVATE" "Activity.MODE_PRIVATE" schreiben (das jetzt erstmal, damit du verstehst, warum das so wie du es willst net geht). Activity erbt indirekt Context. Somit auch alle Variablen (auch MODE_PRIVATE). Daher musst du "Context.MODE_PRIVATE" schreiben. Verstanden? Hmm ich glaub ich kann das net so gut erklären. Schau dir am besten nochmal ein Java-Tutorial (Vererbung) an.

Wenn du in Zukunft so ein Problem hast kannste einfach bei Google "android MODE_PRIVATE" eingeben. In dem Fall wäre das erste Suchergebnis "developer.android.com/reference/android/content/Context.html". Jetzt darfst du nicht zurückschrecken, weils Englisch ist oder so, da kommste net drum herum. Auf der genannten Seite sind alle Funktionen/Variablen/usw aufgelistet und beschrieben .. also in diesem fall auch "MODE_PRIVATE" ..

BTW: Es ist keine gute Idee mit Android-Programmierung anzufangen, wenn man nicht mal die Grundlagen von Java kann ;)
BTW2: Außerdem könntest du statt

public boolean setP(String name,String value){      
    if  (getSharedPreferences(PREFS_NAME , MODE_PRIVATE).edit().putString(name, value).commit()){
        return true;    
    }else{
        return false;
    }   
}

auch einfach

public boolean setP(String name,String value){      
    return getSharedPreferences(PREFS_NAME , MODE_PRIVATE).edit().putString(name, value).commit();
}

schreiben ;) (wobei deine Variante auf keinen Fall falsch ist und wenn du es so gewollt hast auch OK ist)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

04.06.2014, 00:14:53 via Website

Alles klar! Danke... ich muss die App rausbringen bevor ein andere Kommt :D.... ich habe auch php javascript per" learning by doing" gelernt, und habs mittlerweile im Griff ...

und ich habe immerhin mal ein 10 teiliges Youtube Videotutorial im schnelldurchlauf angesehen...... :)

Ich bin kein freund vom normalem lernen.... immerhin kann ich mittlerweile problemlos sqlite bedienen und php request veranstalten :)

Jedoch fallem mir solche details noch schwer, vorallem das ganze mit den Thread's.... :), wird aber schon noch kommen ;)

Danke nochmals!

Antworten
Fabian Simon
  • Forum-Beiträge: 359

04.06.2014, 08:07:24 via Website

Naja dann würd ich dir empfehlen fang erstmal mit Java an bevor du dich an Android probierst.
Da ich vermute das du php und javascript nicht Object Orientiert verwendet hast solltest du dir aufjedenfall die OOP Grundlagen anschauen.
Das heißt Vererbung, Entwurfsmuster, Schnittstellen, Objekte, Klassen,Variabeln, Geltungsbereiche, Abstraction ....
Gruß
Fabian

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 19:12:16 via Website

Irgendwann, wenn ich nicht mehr 70 h in der Woche arbeiten muss, werde ich mir vieleicht irgendwelche lektüren antun, da ich aber NUR ein APP schreibe, und keine Software für das CERN, reicht es mir wenn ich das weiss, was ich wissen muss. ;)

Ich habe ENDLICH die Zeit es auszuprobieren (das wo Jonathan mir gesagt hat)

Eclipse wirft mir aber einen fehler raus? hab ich da was falsch verstanden?

public class SavePreferences{ 




private final String PREFS_NAME = "cookies";


public String viewP(String name){

    String cookie = getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE).getString(name,null);
    return cookie;
}

public boolean setP(String name,String value){

return  getSharedPreferences(PREFS_NAME,Context.MODE_PRIVATE).edit().putString(name, value).commit();
}

}

Bekomme zweimal den fehler bei getSharedPreference ... is undefinifed....

Antworten
Jonathan
  • Forum-Beiträge: 16

07.06.2014, 19:42:14 via Website

Klar .. getSharedPreferences ist ja auch nicht in deiner Klasse SavePreferences definiert (sondern in Context). Also müsstest du es z.B. so machen:

public class SavePreferences {

private final String PREFS_NAME = "cookies";


public String viewP (Context ctx, String name) {
    return ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(name, null);
}

public boolean setP (Context ctx, String name, String value) {
    return ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit().putString(name, value).commit();
}

}

... oder so ..

public class SavePreferences {

private final String PREFS_NAME = "cookies";
private final Context ctx;


public SavePreferences (Context ctx) {
    this.ctx = ctx;
}


public String viewP (String name) {
    return ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).getString(name, null);
}

public boolean setP (String name, String value) {
    return ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit().putString(name, value).commit();
}

}

beides ist möglich aber ich würde das untere nehmen, falls du doch das obere nehmen würdest, würde ich die Funktionen als static deklarieren ("public static" statt nur "public";):)

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 20:26:19 via Website

funktioniert.... jedenfalls zeigt es mir keine fehler mehr an. was mache ich aber bei den anderen Activitiys falsch wenn ich nun diese aufrufe?

public class Login extends Activity {


 private SavePreferences sp;

protected void onCreate(Bundle savedInstanceState) {

SavePreferences sp = new SavePreferences(this);

 if(sp.viewP("CBsave") == null){
    bn.setText(sp.viewP("CBsave"));
    bn.setVisibility(View.GONE);
    TextView bn_txt = (TextView)findViewById(R.id.editText1);
    bn_txt.setVisibility(View.GONE);
    Log.i("benutzername","= "+ sp.viewP("CBsave"));

}
}

Sorry, aber bissher hat es doch immer so funktioniert.... funkt mir der context der SavePreference wieder rein?

Antworten
Jonathan
  • Forum-Beiträge: 16

07.06.2014, 20:27:56 via Website

Hmm, was ist denn der Fehler, was wird in LogCat angezeigt?
EDIT: Ich weiß net obs gewollt ist, aber ich denk net .. du prüfst ob sp.viewP("CBsave";) gleich null ist und verwendet dann diesen Wert!?

— geändert am 07.06.2014, 20:30:13

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 20:29:49 via Website

06-07 18:19:05.632: D/dalvikvm(2426): GC_FOR_ALLOC freed 73K, 8% free 2555K/2752K, paused 55ms, total 67ms
06-07 18:19:05.632: I/dalvikvm-heap(2426): Grow heap (frag case) to 3.219MB for 635812-byte allocation
06-07 18:19:05.732: D/dalvikvm(2426): GC_FOR_ALLOC freed 2K, 6% free 3173K/3376K, paused 92ms, total 92ms
06-07 18:19:05.782: D/dalvikvm(2426): GC_CONCURRENT freed <1K, 6% free 3199K/3376K, paused 4ms+14ms, total 48ms
06-07 18:19:05.873: I/amschti(2426): start
06-07 18:19:05.892: D/AndroidRuntime(2426): Shutting down VM
06-07 18:19:05.892: W/dalvikvm(2426): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
06-07 18:19:05.902: E/AndroidRuntime(2426): FATAL EXCEPTION: main
06-07 18:19:05.902: E/AndroidRuntime(2426): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.awad.awad_glasrechner/com.awad.awad_glasrechner.Login}: java.lang.NullPointerException
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.ActivityThread.access$600(ActivityThread.java:141)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.os.Handler.dispatchMessage(Handler.java:99)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.os.Looper.loop(Looper.java:137)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.ActivityThread.main(ActivityThread.java:5041)
06-07 18:19:05.902: E/AndroidRuntime(2426): at java.lang.reflect.Method.invokeNative(Native Method)
06-07 18:19:05.902: E/AndroidRuntime(2426): at java.lang.reflect.Method.invoke(Method.java:511)
06-07 18:19:05.902: E/AndroidRuntime(2426): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
06-07 18:19:05.902: E/AndroidRuntime(2426): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
06-07 18:19:05.902: E/AndroidRuntime(2426): at dalvik.system.NativeStart.main(Native Method)
06-07 18:19:05.902: E/AndroidRuntime(2426): Caused by: java.lang.NullPointerException
06-07 18:19:05.902: E/AndroidRuntime(2426): at com.awad.awad_glasrechner.Login.onCreate(Login.java:128)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.Activity.performCreate(Activity.java:5104)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
06-07 18:19:05.902: E/AndroidRuntime(2426): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
06-07 18:19:05.902: E/AndroidRuntime(2426): ... 11 more

Antworten
Jonathan
  • Forum-Beiträge: 16

07.06.2014, 20:31:12 via Website

Poste mal com.awad.awad_glasrechner.Login komplett

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 20:33:27 via Website

Complett? Boah... kann ich schon machen, ich kann aber schonmal sagen das, wenn ich es austage /* */ ..... funktionierts!..... ich mach kurz ein bisschen Ordnung in der Activity...... :) kommt in 10 min...

Antworten
Jonathan
  • Forum-Beiträge: 16

07.06.2014, 20:34:53 via Website

Wenn du was änderst am besten nochmal laufen lassen und LogCat posten, damit die Zeilen stimmen

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 20:38:54 via Website

Sorry, deine letzte nachricht zu spät gesehen....... ich machs nochmal!!!

— geändert am 07.06.2014, 20:40:18

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 20:45:26 via Website

.......erledigt.... danke, code wird wieder unsichtbar gemacht ;)

— geändert am 07.06.2014, 20:54:39

Antworten
Jonathan
  • Forum-Beiträge: 16

07.06.2014, 20:48:21 via Website

bn_txt in onCreate ist null, weil findViewById(R.id.editText1) null zurückgegeben hat => in deinem Layout "login" gibts nix mit der ID "editText1" .. prüfe das nochmal

Antworten
Volkan Aydin
  • Forum-Beiträge: 187

07.06.2014, 20:53:14 via Website

funktioniert!! Danke... NERVENAUFREIBEND!!!! solche Fehler ;) vorallem da ich dies im Loccat nicht erkannt habe....... ein langer weg liegt noch vor mir ;)

Antworten
Jonathan
  • Forum-Beiträge: 16

07.06.2014, 20:57:42 via Website

NullPointerExceptions sind eigtl die einfachsten Fehler die es gibt also einfach das nächste mal gucken in welcher Zeile denn der Fehler ist, dann überlegen, was aufgerufen wird, auf welche Variablen zugegriffen wird und gucken wo es herkommt. Hierbei hiflt übrigens auch developer.android.com .. da steht dass findViewById null zurückgibt, wenn die ID nicht vorhanden ist :)

Antworten