Domanda

I'm trying to make a world creator thing like in games and I am using shared preferences to store the arrays and such. But there is a problem. I am trying to update it from another class so I use static variables to do so. But when I go back to the original class with the list view, I find out that nothing has been updated. Any ideas? Here is the code. Oh and no errors came in the logcat.

ListView class.

package you.don't.need-to-know;

import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class WorldMenu extends  ListActivity{
public static SharedPreferences prefs = null;
static String splitter;
String[] worldList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    splitter =  "Create World," + prefs.getString("worldString", "");
    worldList = splitter.split(",");
    setListAdapter(new ArrayAdapter<String>(WorldMenu.this,
    android.R.layout.simple_list_item_1, worldList));


}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    if(position == 0){
        Intent openWorldNamer = new                                           
 Intent("you.don't.need-to-know");
        startActivity(openWorldNamer);
    }

}


}

The Updater:

package you.don't.need-to-know;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class WorldCreator extends Activity{
EditText worldNameEditor;
Button saver;
static String updater;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_worldcreator);
    worldNameEditor = (EditText) findViewById(R.id.editText1);
    saver = (Button) findViewById(R.id.button1);
    updater = worldNameEditor.getText().toString() + ",";
    saver.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Editor editor = WorldMenu.prefs.edit();
            editor.putString("worldString", updater);
            editor.commit();
            Intent openListWorld = new
 Intent("you.don't.need.to-know");
            startActivity(openListWorld);
        }
    });
}
@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();

}

}

Edit: New Code updated with closer to fixing. Updater and List Activity

Updater:

 import android.app.Activity;

 import android.content.Intent;

 import android.content.SharedPreferences;

 import android.content.SharedPreferences.Editor;

 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;

 import android.os.Bundle;

 import android.preference.PreferenceManager;

 import android.view.View;

 import android.widget.Button;

 import android.widget.EditText;


public class WorldCreator extends Activity{
EditText worldNameEditor;
Button saver;
SharedPreferences prefs;
OnSharedPreferenceChangeListener listener;
String updater;
Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_worldcreator);
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    worldNameEditor = (EditText) findViewById(R.id.hello);
    saver = (Button) findViewById(R.id.button1);
    updater = worldNameEditor.getText().toString() + ",";

saver.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        listener = new SharedPreferences.OnSharedPreferenceChangeListener()  
{
            public void onSharedPreferenceChanged(SharedPreferences      
  prefs, String key) {
                editor = prefs.edit();
                editor.putString("worldString", updater);   
                editor.commit();
              }
            };

            prefs.registerOnSharedPreferenceChangeListener(listener);
            Intent openListWorld = new                                    
 Intent("");
            startActivity(openListWorld);

    }});

    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();





    }





@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

}
}

List Activity:

import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class WorldMenu extends  ListActivity{
SharedPreferences prefs = null;
String splitter;
String[] worldList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    splitter =  "Create World," + prefs.getString("worldString", "hello");
    worldList = splitter.split(",");
    setListAdapter(new ArrayAdapter<String>(WorldMenu.this,          
 android.R.layout.simple_list_item_1, worldList));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    if(position == 0){
        Intent openWorldNamer = new                                          
Intent("");
        startActivity(openWorldNamer);
    }

}

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    super.onPause();
    finish();
}


}
È stato utile?

Soluzione

It doesn't look like you are monitoring for changes in the shared preferences. see:

http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener.html

final SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // update your listview.
  }
};

prefs.registerOnSharedPreferenceChangeListener(listener);

So when you get that callback, it will tell you what key changed. Then you could update the adapter for your listview to have the new contents and call onDataSetChanged() in the adapter.

Alternatively, you could move your adapter setting code into the onResume() function. This would make it so when your activity resumes, you check the status of the shared preferences and set the adapter. Be warned though, if the user has scrolled down the list some distance and you call setAdapter() again in the resume, they will lose their scroll position.

EDIT:

Try:

Updater (this shouldn't need to start a new activity, this can just finish()):

import android.app.Activity;

 import android.content.Intent;

 import android.content.SharedPreferences;

 import android.content.SharedPreferences.Editor;

 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;

 import android.os.Bundle;

 import android.preference.PreferenceManager;

 import android.view.View;

 import android.widget.Button;

 import android.widget.EditText;


public class WorldCreator extends Activity{
EditText worldNameEditor;
Button saver;
SharedPreferences prefs;
OnSharedPreferenceChangeListener listener;
String updater;
Editor editor;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_worldcreator);
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    worldNameEditor = (EditText) findViewById(R.id.hello);
    saver = (Button) findViewById(R.id.button1);
    updater = worldNameEditor.getText().toString() + ",";

saver.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
           editor = prefs.edit();
           editor.putString("worldString", updater);   
           editor.commit();
           finish();
    }});

    }

ListView:

import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;


public class WorldMenu extends  ListActivity{
SharedPreferences prefs = null;
String splitter;
String[] worldList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
final SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
    // update your listview.
  }
};

prefs.registerOnSharedPreferenceChangeListener(listener);

}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    splitter =  "Create World," + prefs.getString("worldString", "hello");
    worldList = splitter.split(",");
    setListAdapter(new ArrayAdapter<String>(WorldMenu.this,          
 android.R.layout.simple_list_item_1, worldList));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    if(position == 0){
        Intent openWorldNamer = new                                          
Intent("");
        startActivity(openWorldNamer);
    }

}
}

Altri suggerimenti

Prefrences are defined at the activity level. I'll have my bounty please.

Call getActivity() to get the callers activity then use that to get the prefrences. If you want structure send results back via interface. Implement the interface and use the interface to find the activity. Eclipse creates stubs for you.

Here is the complete class that just changes a prefrence save's it and immediately sends the result back to the calling class. It uses getActivity() so the two classes share the same prefrences. It calls back through an interface.

It's from my app com.gosylvester.bestrides

    package com.gosylvester.bestrides;

import com.google.android.gms.maps.GoogleMap;

import android.support.v4.app.DialogFragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;

//...

public class MapSettings extends DialogFragment implements

    OnCheckedChangeListener {

public static final String MAP_TYPE = "com.gosylvester.bestrides.settings.maptype";
private int _mapType = -1;
BestRidesSettingsDialogListener activity;
SharedPreferences sharedpref;

public interface BestRidesSettingsDialogListener {
    void onMapSettingsChange(int mapType);
}

public MapSettings() {
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // the activity may be null if this is called without implementing the
    // BestRidesSettingsDialogListener (The settings object saves the
    // setting so the
    // call back may not be needed.

    activity = (BestRidesSettingsDialogListener) getActivity();

    getDialog().setTitle(R.string.app_name);
    View view = inflater.inflate(R.layout.activity_map_settings, container);
    RadioGroup rg = (RadioGroup) view.findViewById(R.id.radioGroup1);
    // initialize to the shared preferences value
    rg.clearCheck();
    sharedpref = getActivity().getPreferences(Context.MODE_PRIVATE);
    int x = sharedpref.getInt(MAP_TYPE, GoogleMap.MAP_TYPE_NORMAL);
    RadioButton rb = null;

    switch (x) {
    case GoogleMap.MAP_TYPE_HYBRID:
        rb = (RadioButton) view.findViewById(R.id.RDOHybrid);
        rb.setChecked(true);
        break;
    case GoogleMap.MAP_TYPE_NORMAL:
        rb = (RadioButton) view.findViewById(R.id.RDORoad);
        rb.setChecked(true);
        break;
    case GoogleMap.MAP_TYPE_SATELLITE:
        rb = (RadioButton) view.findViewById(R.id.RDOSatelite);
        rb.setChecked(true);
        break;
    case GoogleMap.MAP_TYPE_TERRAIN:
        rb = (RadioButton) view.findViewById(R.id.RDOTerrain);
        rb.setChecked(true);
        break;
    }
    // set the listener after setting up
    rg.setOnCheckedChangeListener(this);
    return view;
}

public int getMapType() {
    return _mapType;
}

public void setMapType(int mapType) {
    this._mapType = mapType;
}

@Override
public void onCheckedChanged(RadioGroup rg, int checkId) {
    // TODO Auto-generated method stub
    int mapType = 0;
    switch (checkId) {
    case R.id.RDORoad:
        mapType = GoogleMap.MAP_TYPE_NORMAL;
        break;
    case R.id.RDOHybrid:
        mapType = GoogleMap.MAP_TYPE_HYBRID;
        break;
    case R.id.RDOSatelite:
        mapType = GoogleMap.MAP_TYPE_SATELLITE;
        break;
    case R.id.RDOTerrain:
        mapType = GoogleMap.MAP_TYPE_TERRAIN;
        break;
    }
    // run the activity onchange
    // if the activity is null there is no listener to take action on the
    // settings
    if (activity != null) {
        activity.onMapSettingsChange(mapType);
    }

    // save the settings
    if (sharedpref == null) {
        sharedpref = getActivity().getPreferences(Context.MODE_PRIVATE);
    }
    sharedpref.edit().putInt(MAP_TYPE, mapType).commit();
}

}

/* here's a snipet of the other class */

public class KmlReader extends FragmentActivity implements
        BestRidesSettingsDialogListener {

...

mMap.setMapType(sharedPref.getInt(
                com.gosylvester.bestrides.MapSettings.MAP_TYPE,
                GoogleMap.MAP_TYPE_NORMAL));

...

@Override
public void onMapSettingsChange(int mapType) {
    // TODO Auto-generated method stub
    if (mMap != null) {
        mMap.setMapType(mapType);
    }
}

Good Luck

Shared prefernces are meant to be used in multiple classes if all classes are in same process. You do not have to use static explicitely. Just use the same sharedprefernce in both classes.

when you go back to the original class it doesn't guarantee onCreate mothod of the original class can perform ,like other answers say ,you can put the code into onResume mothod ,or after startActivity(intent) add method finish() to finish current activity

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top