0

我创建了一个 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);
}

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

4

1 回答 1

0

这种方法的问题是您从 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("", "");
    }
}

第一个解决方案似乎更好一点。

于 2012-04-14T06:24:47.260 回答