Android 请帮助我从其他类获取SharedReferences保存的值

Android 请帮助我从其他类获取SharedReferences保存的值,android,Android,我将值保存在一个类的SharedReferences中,并尝试从另一个类访问它 类,但获取空指针异常。我输入的值是web服务的url。请帮帮我 UrlSetting.java public class UrlSetting extends Activity { EditText editUrl; TextView Savedurl; Button bSaveUrl, bback; @Override public void onCreate(Bundle savedInstanceState)

我将值保存在一个类的SharedReferences中,并尝试从另一个类访问它 类,但获取空指针异常。我输入的值是web服务的url。请帮帮我

UrlSetting.java

public class UrlSetting extends Activity {
EditText editUrl;
TextView Savedurl;
Button bSaveUrl, bback;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.urlsetting);

    Savedurl = (TextView)findViewById(R.id.savedurl);
    editUrl = (EditText)findViewById(R.id.editurl);
    bback = (Button)findViewById(R.id.back);
    bSaveUrl = (Button)findViewById(R.id.saveurl);
    bSaveUrl.setOnClickListener(buttonSaveUrlOnClickListener);
    bback.setOnClickListener(new Button.OnClickListener(){

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(UrlSetting.this, Login.class);
            /*intent.setClass(UrlSetting.this, Login.class);*/
            startActivity(intent);
        }});

    LoadPreferences();
}
Button.OnClickListener buttonSaveUrlOnClickListener
= new Button.OnClickListener(){

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        SavePreferences("URL", editUrl.getText().toString());
        LoadPreferences();
    }

private void SavePreferences(String key, String value){
    SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
}

private void LoadPreferences(){
    SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
    String strSavedurl = sharedPreferences.getString("URL", "");
    Savedurl.setText(strSavedurl);
}
这是我的Koneksi.java

public class Koneksi{

SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
String url = sharedPreferences.getString("URL", "");
public Koneksi(String urlml){

    url= url + urlml;
}

public String getUrl(){

    return url;
}
这是LogCat

> 05-21 11:39:44.542: W/KeyCharacterMap(339): No keyboard for id 0
05-21 11:39:44.542: W/KeyCharacterMap(339): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
05-21 11:39:51.826: D/TryLoginCheck(339): Here
05-21 11:39:51.826: I/System.out(339): UserNametes
05-21 11:39:51.831: I/System.out(339): passwordTes12345*
05-21 11:39:51.831: D/Parameters(339): username=tes&password=Tes12345*
05-21 11:39:51.831: D/AndroidRuntime(339): Shutting down VM
05-21 11:39:51.831: W/dalvikvm(339): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-21 11:39:51.851: E/AndroidRuntime(339): FATAL EXCEPTION: main
05-21 11:39:51.851: E/AndroidRuntime(339): java.lang.NullPointerException
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
05-21 11:39:51.851: E/AndroidRuntime(339):  at mobile.config.Koneksi.<init>(Koneksi.java:13)
05-21 11:39:51.851: E/AndroidRuntime(339):  at com.karismaelearning.Login.tryLogin(Login.java:131)
05-21 11:39:51.851: E/AndroidRuntime(339):  at com.karismaelearning.Login$3.onClick(Login.java:80)
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.view.View.performClick(View.java:2485)
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.view.View$PerformClick.run(View.java:9080)
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.os.Handler.handleCallback(Handler.java:587)
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.os.Looper.loop(Looper.java:123)
05-21 11:39:51.851: E/AndroidRuntime(339):  at android.app.ActivityThread.main(ActivityThread.java:3683)
05-21 11:39:51.851: E/AndroidRuntime(339):  at java.lang.reflect.Method.invokeNative(Native Method)
05-21 11:39:51.851: E/AndroidRuntime(339):  at java.lang.reflect.Method.invoke(Method.java:507)
05-21 11:39:51.851: E/AndroidRuntime(339):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-21 11:39:51.851: E/AndroidRuntime(339):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-21 11:39:51.851: E/AndroidRuntime(339):  at dalvik.system.NativeStart.main(Native Method)
05-21 11:39:54.301: I/Process(339): Sending signal. PID: 339 SIG: 9
>05-21 11:39:44.542:W/KeyCharacterMap(339):id 0没有键盘
05-21 11:39:44.542:W/KeyCharacterMap(339):使用默认keymap:/system/usr/keychars/qwerty.kcm.bin
5-21 11:39:51.826:D/TryLoginCheck(339):这里
05-21 11:39:51.826:I/System.out(339):用户名
05-21 11:39:51.831:I/System.out(339):密码TES12345*
05-21 11:39:51.831:D/参数(339):用户名=tes,密码=Tes12345*
05-21 11:39:51.831:D/AndroidRuntime(339):关闭虚拟机
05-21 11:39:51.831:W/dalvikvm(339):threadid=1:线程退出时出现未捕获异常(组=0x40015560)
05-21 11:39:51.851:E/AndroidRuntime(339):致命异常:主
05-21 11:39:51.851:E/AndroidRuntime(339):java.lang.NullPointerException
05-21 11:39:51.851:E/AndroidRuntime(339):位于android.content.ContextWrapper.getSharedReferences(ContextWrapper.java:146)
05-21 11:39:51.851:E/AndroidRuntime(339):位于mobile.config.Koneksi.(Koneksi.java:13)
05-21 11:39:51.851:E/AndroidRuntime(339):在com.karismaelearning.Login.tryLogin(Login.java:131)
05-21 11:39:51.851:E/AndroidRuntime(339):在com.karismaelearning.Login$3.onClick(Login.java:80)
05-21 11:39:51.851:E/AndroidRuntime(339):在android.view.view.performClick(view.java:2485)
05-21 11:39:51.851:E/AndroidRuntime(339):在android.view.view$PerformClick.run(view.java:9080)
05-21 11:39:51.851:E/AndroidRuntime(339):在android.os.Handler.handleCallback(Handler.java:587)上
05-21 11:39:51.851:E/AndroidRuntime(339):在android.os.Handler.dispatchMessage(Handler.java:92)上
05-21 11:39:51.851:E/AndroidRuntime(339):在android.os.Looper.loop(Looper.java:123)上
05-21 11:39:51.851:E/AndroidRuntime(339):位于android.app.ActivityThread.main(ActivityThread.java:3683)
05-21 11:39:51.851:E/AndroidRuntime(339):位于java.lang.reflect.Method.Invokenactive(本机方法)
05-21 11:39:51.851:E/AndroidRuntime(339):在java.lang.reflect.Method.invoke(Method.java:507)
05-21 11:39:51.851:E/AndroidRuntime(339):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-21 11:39:51.851:E/AndroidRuntime(339):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-21 11:39:51.851:E/AndroidRuntime(339):在dalvik.system.NativeStart.main(本机方法)
05-21 11:39:54.301:I/进程(339):发送信号。PID:339信号:9

请帮我知道是什么错误。我不明白怎么了。非常感谢

试试这两种方法:p效果很好

public static void SavePreferences(String key, String name, String value,Context c) {
    SharedPreferences sf = c.getSharedPreferences(key, 0);
    SharedPreferences.Editor editor = sf.edit();
    editor.putString(name, value);
    editor.commit();
    Log.w("Preference saved  .", value);

}

public static String LoadPreferences(String key, String name, Context c) {
    SharedPreferences sf = c.getSharedPreferences(key, 0);
    String val = null;
    val = sf.getString(name, "");
    return val;

}

这些将为您提供
NPE

SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);                                                          
String url = sharedPreferences.getString("URL", "");
将初始化移动到
onCreate()
,我看不到,但假设您已经看到了,因为您正在扩展
活动

public class Koneksi extends Activity {

    SharedPreferences sharedPreferences; //declare them here
    String url;

    public void onCreate(Bundle bundle)
   {
        super.onCreate(bundle);
        setContentView(R.layout.your_layout);

       sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);  // initialize them here
       url = sharedPreferences.getString("URL", "");  // intialize here

    public Koneksi(String urlml){   
        url= url + urlml;
    }
SharedReferences
需要一个
上下文
,该上下文在调用
onCreate()
之后才可用。您可以在此之前按原样声明它们,但需要在调用
onCreate()
后的
onCreate()
或另一个
Activity
方法中初始化它们

   - you should be pass the context 



   mContext.getSharedPreferences(PREF_NAME, MODE_PRIVATE);




  other wise use following code :-
  import android.preference.PreferenceManager;
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  // then you use
  prefs.getBoolean("keystring", true);
SharedPreferences sharedPreferences;

onCreate(Bundle savedInstanceState){
  sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
  // your code..
}

private void SavePreferences(String key, String value){

    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
}

private void LoadPreferences(){

    String strSavedurl = sharedPreferences.getString("URL", "");
    Savedurl.setText(strSavedurl);
}

编辑:

    public class Koneksi{

    SharedPreferences sharedPreferences;
    Context myC;
    String url = "";

    public Koneksi(Context con){
       myC = con;
       sharedPreferences = PreferenceManager.getDefaultSharedPreferences(con);
    }


    public Koneksi(String urlml){

        url= url + urlml;
    }


    public String getUrl(){
        String url = sharedPreferences.getString("URL", "");
        return url;
    }
}
对于活动中的课上通话:

Koneksi ob = new Koneksi(this);
String URL = ob.getUrl();

SharedReference在您的应用程序中很常见,您可以在应用程序中的任何位置使用


我不知道你的代码有什么问题,我也有同样的工作实现

    public class GreetingCardData {
    public static final String SHARED_PREF_FILE     =   "greetingCardData";
    public static final String KEY_DO_NOT_SHOW      =   "doNotShow";
    public static final String KEY_CATEGORIES_JSON  =   "categoriesJson";   
    private SharedPreferences sharedPrefs;
    private Editor prefsEditor;

    public GreetingCardData(Context context) {
        this.sharedPrefs = context.getSharedPreferences(SHARED_PREF_FILE, 0);
        this.prefsEditor = sharedPrefs.edit();
    }   

    public void setDoNotShowFlag ( boolean flag ){
        prefsEditor.putBoolean( KEY_DO_NOT_SHOW, flag );
        prefsEditor.commit();
    }

    public boolean getDoNotShowFlag(){
        return sharedPrefs.getBoolean( KEY_DO_NOT_SHOW, false );
    }

    public void setGreetingcardJson( String jsonString ){
        prefsEditor.putString( KEY_CATEGORIES_JSON, jsonString );
        prefsEditor.commit();
    }

    public String getGreetingcardJsonString(){
        return sharedPrefs.getString(KEY_CATEGORIES_JSON, "");
    }    
}
你可以在任何地方访问你的pref.,只需像

if( !new GreetingCardData(ActivityMain.this).getDoNotShowFlag())
     startHomeActivity();   


new GreetingCardData(context).setGreetingcardJson(resBuffer.toString());

从哪里得到空指针?请张贴logcat,以便我们可以帮助您easier@codeMagic,我已经用LogCat编辑了我的问题。谢谢,
登录
的第131行是什么?这就是你的错误所在is@codeMagic,linkurl=newkoneksi(“/Login.php”);这是第131行……对不起,错误在
Koneksi活动中。看看我的答案。我相信它会解决你的问题这根本不能回答问题。“你可以在非活动中这样做…”这是指什么?只有代码的答案通常不被接受。请解释您的答案,这样人们就会知道为什么您的代码应该在我必须放置上下文的地方工作?O.使用
Context
Context.getSharedReferences*“MY_SHARED_PREF”,MODE_private)您可以将其传递给类的构造函数,如MyClass MyClass=new MyClass(此);非常感谢你的帮助:不客气。很抱歉,我无法尽快回复,但我不得不睡觉…mehi codeMagic已经迟到了。我可以问另一个问题吗[链接],我真的需要帮助解决这个问题,因为我不知道我的错误在哪里。如果你有时间,请看这个问题。非常感谢你们,我在koneksi类中遇到了错误,但在koneksi类中我并没有使用布局。那么如何调用首选项呢?对于URLSETING类,我是否必须删除模式_PRIVATE并将其更改为类似于您的ans?O.O和字符串url=sha。。。是在公共字符串获取url之后吗?因为对公众来说,科内基是红色的。。或者我必须把它都放进去?我不明白你想说什么。但是只要用我的代码就行了。嗯,我在url=url+urlml处出错了,它有红色标记。。O.O谢谢添加此字符串url=“”;在上下文myC之后;检查我编辑的ans