2015-10-26 139 views
0

我有一個問題,我的共享首選項不工作在類文件中。我很困惑,無法解決它。以下是我的文件globalfile,其中保存數據如下。共享首選項不起作用

public class globalfile extends Activity { 
SharedPreferences sharedpreferences; 
public static final String mypreference = "mypref"; 
public static final String Pwd = "pwdKey"; 
public static final String Email = "emailKey"; 

private static String global_username = "null/", global_pwd = "null/"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    sharedpreferences = getSharedPreferences(mypreference, 
      Context.MODE_PRIVATE); 

} 

public String getusername() { 

    global_username = sharedpreferences.getString(Email, ""); 
    return global_username; 
} 

public String getuserpwd() { 

    global_pwd = sharedpreferences.getString(Pwd, ""); 
    return global_pwd; 

} 

public void setusername(String someVariable) { 
    global_username = someVariable; 
    SharedPreferences.Editor editor = sharedpreferences.edit(); 
    editor.putString(Email,global_username); 
    editor.commit(); 

} 

public void setuserpwd(String someVariable) { 
    global_pwd = someVariable; 
    SharedPreferences.Editor editor = sharedpreferences.edit(); 
    editor.putString(Pwd,global_pwd); 
    editor.commit(); 

} 
} 

我第一被叫setuserpwd()& setusername()然後,使用類globalfile.But的對象總是返回null.although如果我使用這個代碼,無需共享pref.it getuserpwd()& getusername()從另一個活動做工精緻

+0

你在哪裏調用'setusername()'和'setuserpwd()'? – Lal

+1

如果'globalfile'是實用類,那麼爲什麼要擴展Activity? –

回答

0

create an instance of Activity with Activity class object

從技術上講,你可以創建一個Activity類的一個實例。但是,活動實例將是無用的,因爲它的基礎上下文不會被設置。

規則是你永遠不應該自己創建Android組件實例(Activity,Service,BroadcastReceiver,Provider)(使用new關鍵字或其他方法)。這些類只能由Android框架創建,因爲Android會爲這些對象設置底層Context並管理生命週期。

我認爲你新創建的活動對象不能得到實際的上下文。所以儘量避免目前的流量。我建議你創建一個單獨的類,可以作爲工廠類使用,我認爲你的問題將解決。 或者另一個解決辦法是這樣的:

Context context = /*get application context*/ 
    SharedPreferences sharedPref = context.getSharedPreferences(
     getString(R.string.preference_file_key), Context.MODE_PRIVATE); 
    /*get value from this sharedPref*/ 

所以你不需要創建活動類對象,在這裏你應該避免以前的getter方法來獲取價值。

0

將全局文件變爲工具類而不是活動,因此可以非常容易地被應用程序的其他部分使用(這不是活動,但可以訪問android上下文)。

public class Global { 
    private final SharedPreferences sharedpreferences; 
    public static final String mypreference = "mypref"; 
    public static final String Pwd = "pwdKey"; 
    public static final String Email = "emailKey"; 

    private static String global_username = "null/", 
     global_pwd = "null/"; 

    public Global(Context context) { 
     this.sharedpreferences = context.getSharedPreferences(mypreference, 
      Context.MODE_PRIVATE); 
    } 


    public String getusername() { 

     global_username = sharedpreferences.getString(Email, "null/"); 
     return global_username; 
    } 

    public String getuserpwd() { 

     global_pwd = sharedpreferences.getString(Pwd, "null/"); 
     return global_pwd; 

    } 

    public void setusername(String someVariable) { 
     global_username = someVariable; 
     sharedpreferences.edit().putString(Email,global_username).commit(); 
    } 

    public void setuserpwd(String someVariable) { 
     global_pwd = someVariable; 
     sharedpreferences.edit().putString(Pwd,global_pwd).commit(); 

    } 
} 

這裏是如何使用您的新的Util類

Global global = new Global(context); 
global.setusername("foo"); 
Log.d("TAG", "username from prefs = " + global.getusername()); 
global.setuserpwd("bar"); 
Log.d("TAG", "password from prefs = " + global.getusername()); 
+0

謝謝,但現在它在簡單的應用程序中運行良好,但在我使用它的應用程序中拋出錯誤:java.lang.InstantiationException:無法實例化類com.example.sony.iwashapp.globalfile;沒有空的構造函數 進程:com.example.sony.iwashapp,PID:18941 java.lang.RuntimeException:無法實例化應用程序com.example.sony.iwashapp.globalfile:java.lang.InstantiationException:無法實例化類com.example.sony.iwashapp.globalfile;沒有空的構造函數 –

+0

嘿謝謝,它現在工作,非常感謝。 –

+0

@PrashantSinghVerma你能接受這個答案嗎? – petey