6

我从非Activity类读取getSharedPreferences以在播放器中设置播放列表时遇到问题...在我的活动中,我从edittext获取字符串变量以获取文件夹路径以处理音频文件...

    public class MainActivity extends Activity {


String ppp;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
    String PATH = getSharedPreferences("PATH", MODE_PRIVATE).getString("path", ppp);
    if (PATH == null){
        ..........
            ...........
        path_tv.setText("folder is undefined");
    }
    else {
        path_tv.setText("folder defined: /mnt/sdcard/" + PATH);
    }
    set_path.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (path_edit.getText().toString().length() == 0){
                Toast.makeText(getBaseContext(), "folder is undefined", Toast.LENGTH_SHORT).show();
            }
            else {
            ppp = path_edit.getText().toString();
            getSharedPreferences("PATH", MODE_PRIVATE)
            .edit()
            .putString("path", ppp)
            .commit();
            File folder = new File(Environment.getExternalStorageDirectory() + "/" + ppp);
            boolean success = false;
            if (!folder.exists()) {
                success = folder.mkdir();
                if (success) Toast.makeText(getBaseContext(), ".....", Toast.LENGTH_SHORT).show();
            }
            String PATH = getSharedPreferences("PATH", MODE_PRIVATE).getString("path", ppp);
            path_tv.setText("........ /mnt/sdcard/" + PATH);
            path_edit.setText("");
            }
        }
    });

所以,在活动中,我可以在共享首选项中更改和保存 String 的值......但是我可以从公共课程中做到这一点......?欣赏任何例子...

4

4 回答 4

11

一种方法是使用Application对象。这是一个肮脏的黑客,但有时还是很有帮助的。

首先,您的 Application 类中需要一个静态成员,因此:

public class MyApplication extends Application {
    private static MyApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }

    public static MyApplication getInstance() {
        return instance;
    }
}

由于 Application 对象总是在任何活动被创建和运行之前创建,并且在整个应用程序生命周期中都被保留,因此您始终可以确保您将拥有一个合适的对象。

然后在您的代码中简单地调用MyApplication.getInstance(),您将拥有全局应用程序上下文。

记得MyApplication在清单中声明。

于 2012-09-13T12:06:27.917 回答
9

您必须将上下文传递给您的类方法:

主要活动:

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Test t = new Test("Show Preference: ");
        getSharedPreferences("PATH", MODE_PRIVATE)
        .edit()
        .putString("p", "preference")
        .commit();
        t.showToast(this.getApplicationContext());
    }
}

测试类:

public class Test {
    private String s;

    public Test(String s){
        this.s = s;
    }

    public void showToast (Context c){
        String pref = c.getSharedPreferences("PATH", Context.MODE_PRIVATE).getString("p", "Error");
        Toast.makeText(c.getApplicationContext(), s + pref, Toast.LENGTH_LONG).show();
    }
}

希望有所帮助

于 2012-09-13T12:16:27.120 回答
1

您需要在类的构造函数中传递上下文,然后使用此上下文执行共享首选项的读取或写入操作,如

           public class xyx{
            public  xyx(Context context){
             this.context= context
             }

     Now use this context 
于 2012-09-13T12:02:39.107 回答
0

添加 MainActivity.this。在 getSharedPreferences 之前

于 2012-09-13T12:02:30.040 回答