简体   繁体   中英

Shared Preferences

I am trying to user SharedPrefs in my app, I simply want to retrieve a email address and password from a seperate settings activity. I have implemented

package com.overclockerz.webtest;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;

public class SettingScreen extends Activity {
    static EditText username;
    static EditText password;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.setting_screen);
    username = (EditText) findViewById(R.id.username);
    password = (EditText) findViewById(R.id.password);

    SharedPreferences settings =  
            getSharedPreferences("APP_PREFS", MODE_PRIVATE); 
    SharedPreferences.Editor prefEditor = settings.edit();
    prefEditor.putString("Username", username.getText().toString());
    prefEditor.putString("Password", username.getText().toString());
    prefEditor.commit();        

}

}

And I have tried to retrieve with package com.overclockerz.webtest;

import org.apache.http.util.EncodingUtils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.CookieManager;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemSelectedListener,
        OnClickListener {
String query = "fldUsername=" + username + "&fldPassword=" + password + "&ut=3";
String username = prefs.getString("Username");
String password = getText(R.id.password).toString();

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 
        // then you use
        prefs.getBoolean("keystring", true);
        //there are also methods to put strings,float, longs, ints





        WebView myWebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setUserAgentString("SMUK");
        //myWebView.setInitialScale(100);
        //myWebView.setPadding(0, 0, 0, 0);
        CookieManager.getInstance().setAcceptCookie(true);

        // webSettings.setUseWideViewPort(true);
        webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                EncodingUtils.getBytes(query,"BASE64"));
        Toast.makeText(getApplicationContext(), query, Toast.LENGTH_LONG)
         .show();
        Spinner spinner = (Spinner) findViewById(R.id.menu_spinner);
        // Create an ArrayAdapter using the string array and a default spinner
        // layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                this, R.array.spinner_links,
                android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(this);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView myWebView = (WebView) findViewById(R.id.webview);
        // Check if the key event was the Back button and if there's history
        if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
            myWebView.goBack();
            return true;
        }
        // If it wasn't the Back key or there's no web page history, bubble up
        // to the default
        // system behavior (probably exit the activity)
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;

    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        WebView myWebView = (WebView) findViewById(R.id.webview);
        switch (arg2) {
        case 0:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView.loadUrl("http://test.schoolmilkuk.co.uk/parent-home");
            break;
        case 1:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView
                    .loadUrl("http://test.schoolmilkuk.co.uk/parent-change-pass");
            break;
        case 2:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView
                    .loadUrl("http://test.schoolmilkuk.co.uk/parent-add-child");
            break;
        case 3:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView
                    .loadUrl("http://test.schoolmilkuk.co.uk/parent-children-list");
            break;
        case 4:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView.loadUrl("http://test.schoolmilkuk.co.uk/parent-order");
            break;
        case 5:
            myWebView.clearCache(true);
            Toast.makeText(getApplicationContext(), "Cache Cleared :)",
                    Toast.LENGTH_LONG).show();
            break;
        default:
            myWebView.loadUrl("http://test.schoolmilkuk.co.uk/parent-home");
            break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.settings_menu:
            startActivity(new Intent(this, SettingScreen.class));
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

}

String username = prefs.getString("Username", "Username") doesn't make sense as it's not using the variables the user set because your supplying "username"? I am very very confused.

After Following Blackbelt's Advice (of which all is very much appreciated ) I revised the code to and I am seeing a null pointer exception?

package com.overclockerz.webtest;

import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.EditText;

public class SettingScreen extends Activity {
    static EditText username;
    static EditText password;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.setting_screen);
        username = (EditText) findViewById(R.id.username);
        password = (EditText) findViewById(R.id.password);

        SharedPreferences settings =  
                getSharedPreferences("APP_PREFS", MODE_PRIVATE); 
        SharedPreferences.Editor prefEditor = settings.edit();
        prefEditor.putString("Username", username.getText().toString());
        prefEditor.putString("Password", username.getText().toString());
        prefEditor.commit();        

    }

}

package com.overclockerz.webtest;

import org.apache.http.util.EncodingUtils;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.CookieManager;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;

public class MainActivity extends Activity implements OnItemSelectedListener,
        OnClickListener {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String username = prefs.getString("Username", "default");
String password = prefs.getString("Password", "default");

String query = "fldUsername=" + username + "&fldPassword=" + password + "&ut=3";
    @SuppressLint("SetJavaScriptEnabled")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        WebView myWebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setUserAgentString("SMUK");
        //myWebView.setInitialScale(100);
        //myWebView.setPadding(0, 0, 0, 0);
        CookieManager.getInstance().setAcceptCookie(true);

        // webSettings.setUseWideViewPort(true);
        webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
        myWebView.setWebViewClient(new WebViewClient());
        myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                EncodingUtils.getBytes(query,"BASE64"));
        Toast.makeText(getApplicationContext(), query, Toast.LENGTH_LONG)
         .show();
        Spinner spinner = (Spinner) findViewById(R.id.menu_spinner);
        // Create an ArrayAdapter using the string array and a default spinner
        // layout
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
                this, R.array.spinner_links,
                android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        // Apply the adapter to the spinner
        spinner.setAdapter(adapter);

        spinner.setOnItemSelectedListener(this);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView myWebView = (WebView) findViewById(R.id.webview);
        // Check if the key event was the Back button and if there's history
        if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
            myWebView.goBack();
            return true;
        }
        // If it wasn't the Back key or there's no web page history, bubble up
        // to the default
        // system behavior (probably exit the activity)
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;

    }

    @Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
            long arg3) {
        WebView myWebView = (WebView) findViewById(R.id.webview);
        switch (arg2) {
        case 0:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView.loadUrl("http://test.schoolmilkuk.co.uk/parent-home");
            break;
        case 1:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView
                    .loadUrl("http://test.schoolmilkuk.co.uk/parent-change-pass");
            break;
        case 2:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView
                    .loadUrl("http://test.schoolmilkuk.co.uk/parent-add-child");
            break;
        case 3:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView
                    .loadUrl("http://test.schoolmilkuk.co.uk/parent-children-list");
            break;
        case 4:
            myWebView.postUrl("http://test.schoolmilkuk.co.uk/parents-login",
                    EncodingUtils.getBytes(query,"BASE64"));
            myWebView.loadUrl("http://test.schoolmilkuk.co.uk/parent-order");
            break;
        case 5:
            myWebView.clearCache(true);
            Toast.makeText(getApplicationContext(), "Cache Cleared :)",
                    Toast.LENGTH_LONG).show();
            break;
        default:
            myWebView.loadUrl("http://test.schoolmilkuk.co.uk/parent-home");
            break;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.settings_menu:
            startActivity(new Intent(this, SettingScreen.class));
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

}

PreferenceManager.getDefaultSharedPreferences

and

SharedPreferences settings =  
            getSharedPreferences("APP_PREFS", MODE_PRIVATE); 

returns different thing.

the former will use a default file name (something like your pakage name), the latter will require a name. So do not get confused. The second parameter of getString() is a default value. You can use it to check that some condiments are not meet, for instance.

Reread docs for getString . It returns defValue only if there is no value in preferences. You can pass null as second argument. And if you get null it means there is no username yet set.
Also you should save username to preferences on some action, not in onCreate . Eg create button "OK" and save username in onClick for this button.

If you need multiple shared preferences then put some name in them.

SharedPreferences sp = getApplication().getSharedPreferences("someName", Context.MODE_PRIVATE); 

If you need just one then

SharedPrefrences sp = PreferenceManager.getDefaultSharedPreferences(this);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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