繁体   English   中英

在Android中使用SharedPreferences类?

[英]Using a SharedPreferences class in Android?

我制作了一个SharedPreferences类,以便其余的Activity可以在线使用以获取首选项。

 public class SPAdapter extends Activity {

    public final String preferenceSettings = "STORAGE";

        // Default value if row does not exist in preference
     public static final String rowExistence = "Row did not exist";

public String prefGet(String preferenceName, String rowId) {
    SharedPreferences preferenceObject = getSharedPreferences(preferenceName, MODE_PRIVATE);
    String value = preferenceObject.getString(rowId, rowExistence);
    return value;
}

我这样使用这种方法:

    public class Splash extends Activity {

     private SPAdapter spObject;
     public String rowNumber(0);
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.splash);

         spObject.prefGet(spObject.preferenceSettings,
            rowNumber);
}

但是,每当我尝试使用此方法时,应用程序都会崩溃,并显示有关上下文的错误。 有人可以帮我这个忙吗?

这种方法的问题是,您从Activity扩展了SPAdapter,并且没有正确初始化它,它没有适当的Context设置,因此它无法通过它从框架中获取SharedPreferences实例。 但是无论如何,这不是您应该在Android中执行的方式,不是实例化新Activity对象的人,这应该是框架的工作。 这是使此工作正常的两种方法:

  • 从SPAdapter扩展您的Splash活动。

  • 不要从Activity扩展SPAdapter,只需传递Context对象的引用并使用该对象获取SharedPreferences实例。 像这样:

    公共类SPAdapter {public final String preferenceSettings =“ STORAGE”;

     // Default value if row does not exist in preference public static final String rowExistence = "Row did not exist"; private Context ctx; public SPAdapter(Context ctx){ this.ctx = ctx; } public String prefGet(String preferenceName, String rowId) { SharedPreferences preferenceObject = ctx.getSharedPreferences( preferenceName, Context.MODE_PRIVATE); String value = preferenceObject.getString(rowId, rowExistence); return value; } 

    }

像这样使用它:

public class FsActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SPAdapter sa = new SPAdapter(getApplicationContext());
        sa.prefGet("", "");
    }
}

第一种解决方案似乎更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM