简体   繁体   English

在Android中使用SharedPreferences存储数据

[英]Storing Data with SharedPreferences in Android

I'm new to Android programming and I've never dabbled in saving values or settings before. 我是Android编程的新手,我以前从未考虑过保存值或设置。 I've taken a look at Storage Options and I've tried to Implement SharedPreferences. 我已经看了存储选项 ,我试图实现SharedPreferences。 And from my point of view, when I create a new event, I tell it to pull some data, and set a TextView to the value. 从我的角度来看,当我创建一个新事件时,我告诉它提取一些数据,然后将TextView设置为该值。 However it never sets the TextView; 但它永远不会设置TextView; and I can't seem to figure out what is wrong. 我似乎无法弄清楚出了什么问题。

createEvent This is where I'm creating the values I want to stored. createEvent这是我创建我想要存储的值的地方。

@Override
protected void onCreate(Bundle savedInstanceState) {
    LayoutInflater inflater = this.getLayoutInflater();
    final View vView = inflater.inflate(R.layout.fragment_main, null);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mNavigationDrawerFragment = (NavigationDrawerFragment)
            getFragmentManager().findFragmentById(R.id.navigation_drawer);
    mTitle = getTitle();

    // Set up the drawer.
    mNavigationDrawerFragment.setUp(
            R.id.navigation_drawer,
            (DrawerLayout) findViewById(R.id.drawer_layout));

    SharedPreferences settings = getPreferences(0);
    int iEventCounter = settings.getInt("eventCounter", 0);
    if (iEventCounter > 0){
        String eventName1 = settings.getString("event1Name", "Name of Event");
        TextView eventLabelName = (TextView)vView.findViewById(R.id.section_label);
        eventLabelName.setText(eventName1);
    }
    else if (iEventCounter == 0 || iEventCounter < 0){
        TextView eventLabelName = (TextView)vView.findViewById(R.id.section_label);
        eventLabelName.setText("There is no event stored in memory.");
    }
}

eventAdd (Here is where I commit data to SharedPreferences eventAdd (这是我向SharedPreferences提交数据的地方

public int eventAdd(String sName, String sDate) {
    LayoutInflater inflater = this.getLayoutInflater();
    final View vView = inflater.inflate(R.layout.fragment_main, null);
    TextView eventLabelName = (TextView)vView.findViewById(R.id.testTextView);
    eventLabelName.setText("test"); //Never changes
    SharedPreferences settings = getPreferences(0); //Create SharedPreferences
    SharedPreferences.Editor editor = settings.edit(); //Create editor
    iEventCounter = settings.getInt("eventCounter", 0);
    iEventCounter = iEventCounter+1;
    editor.putInt("eventCounter", iEventCounter); //Put values for first Event into SharedPreferences
    editor.putString("event1Name", sName);
    editor.putString("event1Date", sDate);
    // Commit the edits!
    editor.commit();

    //Change Label based on number of Events thus far.
    if (iEventCounter > 0){
        String eventName1 = settings.getString("event1Name", "Name of Event");

        eventLabelName.setText(eventName1);
    }
    else if (iEventCounter == 0 || iEventCounter < 0){
        eventLabelName.setText("There is no event stored in memory.");
    }
    return iEventCounter;
    //eventLabelName.setText(iEventCounter); Doesn't do anything, doesn't change Text.
}

I don't get an error, the app doesn't crash, it just doesn't work. 我没有收到错误,应用程序没有崩溃,它只是不起作用。 Can anyone see anything wrong here? 谁能在这里看到任何错误? Any help would be greatly appreciated. 任何帮助将不胜感激。

You are inflating a view but not setting it to activity's content. 您正在给视图充气但不将其设置为活动的内容。 So you don't see any change . 所以你没有看到任何变化。

final View vView = inflater.inflate(R.layout.fragment_main, null); 
setContentView(R.layout.activity_main);

Maybe you should use; 也许你应该使用;

setContentView(mView);

Or if you want to set activity_main to your activity's content, change; 或者,如果您想将activity_main设置为活动的内容,请更改;

vView.findViewById

to

findViewById

Try to refactor your code. 尝试重构您的代码。 There are some unnecessary codes. 有一些不必要的代码。

Try changing 尝试改变

SharedPreferences settings = getPreferences(0);

in both methods to 在两种方法中

SharedPreferences settings = getSharedPreferences("preferenceName", 0);

Your code is kinda strange at some points. 你的代码在某些方面有点奇怪。

In the first place, you could turn this code 首先,您可以转换此代码

SharedPreferences settings = getPreferences(0);
    int iEventCounter = settings.getInt("eventCounter", 0);
    if (iEventCounter > 0){
        String eventName1 = settings.getString("event1Name", "Name of Event");
        TextView eventLabelName = (TextView)vView.findViewById(R.id.section_label);
        eventLabelName.setText(eventName1);
    }
    else if (iEventCounter == 0 || iEventCounter < 0){
        TextView eventLabelName = (TextView)vView.findViewById(R.id.section_label);
        eventLabelName.setText("There is no event stored in memory.");
    }

into the next one: 进入下一个:

SharedPreferences settings = getSharedPreferences("preferences", MODE_PRIVATE); //Always use the name of the variable to know its meaning. 
    int iEventCounter = settings.getInt("eventCounter", 0);
    if (iEventCounter > 0){
        String eventName1 = settings.getString("event1Name", "Name of Event");
        TextView eventLabelName = (TextView)vView.findViewById(R.id.section_label);
        eventLabelName.setText(eventName1);
    }
    else { // We know what the other cases are, more readable
        TextView eventLabelName = (TextView)vView.findViewById(R.id.section_label);
        eventLabelName.setText("There is no event stored in memory.");
    }

and this other piece: 而这另一件:

   SharedPreferences settings = getPreferences(0); //Create SharedPreferences
            SharedPreferences.Editor editor = settings.edit(); //Create editor
            iEventCounter = settings.getInt("eventCounter", 0);
            iEventCounter = iEventCounter+1;
            editor.putInt("eventCounter", iEventCounter); //Put values for first Event into SharedPreferences
            editor.putString("event1Name", sName);
            editor.putString("event1Date", sDate);
            // Commit the edits!
            editor.commit();

            //Change Label based on number of Events thus far.
            if (iEventCounter > 0){
                String eventName1 = settings.getString("event1Name", "Name of Event");

                eventLabelName.setText(eventName1);
            }
            else if (iEventCounter == 0 || iEventCounter < 0){
                eventLabelName.setText("There is no event stored in memory.");

into this piece: 进入这件作品:

SharedPreferences settings = getSharedPreferences("preferences", MODE_PRIVATE); //Same as before
    iEventCounter = settings.getInt("eventCounter", 0); // We first get the value, then we edit
    SharedPreferences.Editor editor = settings.edit(); //Create editor

    editor.putInt("eventCounter", ++iEventCounter); //Pre-increment first increments the variable value then does whatever you wanted to.
    editor.putString("event1Name", sName);
    editor.putString("event1Date", sDate);
    // Commit the edits!
    editor.commit();

    //Change Label based on number of Events thus far.
    if (iEventCounter > 0){
        String eventName1 = settings.getString("event1Name", "Name of Event");
        eventLabelName.setText(eventName1);
    }
    else { // Same as before
        eventLabelName.setText("There is no event stored in memory.");

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

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