Страница 1 из 1
Не загружает sharedPreferences
Добавлено: 11 мар 2014, 06:41
IriDolG
Создала две активити. В первой сохраняю данные:
Код: Выделить всё
void saveText() {
sPref = getSharedPreferences("Stats",MODE_PRIVATE);
Editor edhealth = sPref.edit();
edhealth.putString(SAVED_TEXT, healthvalue); \\ healthvalue - string
edhealth.commit();
Во второй пытаюсь получить эти данные, но выдает пустую строку. Хотя значение healthvalue в первой активити отображается верно.
Код: Выделить всё
void loadText() {
sPrefhealth = getSharedPreferences("Stats",MODE_PRIVATE);
String savedhealth = sPrefhealth.getString(SAVED_TEXT,"");
TextView statnumhealth=(TextView)findViewById(R.id.statnumhealth);
statnumhealth.setText(savedhealth);
Re: Не загружает sharedPreferences
Добавлено: 11 мар 2014, 06:53
IriDolG
Изменила edhealth.putString(SAVED_TEXT, healthvalue); . Вместо healthvalue выставила обычное число - оно отображается во второй активити. Подскажите, в чем проблема с healthvalue?
Re: Не загружает sharedPreferences
Добавлено: 11 мар 2014, 07:59
siberprogs
А это вы используете?
[syntax=java]import android.content.Context;[/syntax]
Попробуйте так:
[syntax=java]sPref = getSharedPreferences("Stats",Context.MODE_PRIVATE); [/syntax]
Re: Не загружает sharedPreferences
Добавлено: 11 мар 2014, 08:09
klblk
IriDolG писал(а):Изменила edhealth.putString(SAVED_TEXT, healthvalue); . Вместо healthvalue выставила обычное число - оно отображается во второй активити. Подскажите, в чем проблема с healthvalue?
если число сохраняется нормально, значит проблема видимо в healthvalue и нужно смотреть, что происходит по коду "выше". Оно точно не пустое? попробуйте вывести лог перед записью в настройки.
Re: Не загружает sharedPreferences
Добавлено: 11 мар 2014, 08:15
klblk
siberprogs писал(а):А это вы используете?
[syntax=java]import android.content.Context;[/syntax]
Попробуйте так:
[syntax=java]sPref = getSharedPreferences("Stats",Context.MODE_PRIVATE); [/syntax]
В этом нет необходимости "внутри" Activity, т.к. она является наследником Context.
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 04:30
IriDolG
Логи использую - все нормально. Причем healthvalue это string, полученный из переменной health (с помощью valueOf). Эта строка у меня также отображается при нажатии на кнопку в TextView (что дополнительно и вызывает сохранение), поэтому можно отследить, что она не пустая. Бьюсь над этим уже долго. Тем более, что сохранение параметров это ключевая проблема в игре.
PS: такой еще вопрос - как можно сохранить несколько параметров с помощью Preferences? Упорно не понимаю SQLite. Даже, использовав код с соответствующего урока, он почему-то не заработал у меня (при нажатии на кнопки ничего не происходило).
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 06:04
klblk
Какие-то непонятные проблемы "ниоткуда" у вас берутся.
у себя проверил:
[syntax=java] SharedPreferences sPref;
sPref = getSharedPreferences("Stats", MODE_PRIVATE);
Log.w("m_log_tag", "begin: " + sPref.getString("m_tag", "no_my_value"));
Editor edhealth = sPref.edit();
edhealth.putString("m_tag", "my_value");
edhealth.commit();
sPref = getSharedPreferences("Stats", MODE_PRIVATE);
String savedhealth = sPref.getString("m_tag", "no_my_value");
Log.w("m_log_tag", "end: " + savedhealth);[/syntax]
последовательно работает. По идеи и в разных Activity проблем не должно быть. Единственное м.б. у вас вторая Activity в другом процессе оказалась случайно? (в манефесте не прописано что-то типа "android:process=":remote" у активити?);
может load вызывает перед save? или переменная SAVED_TEXT разная? Попробуйте создать тестовое приложение чисто с этими функциями.
Насколько я знаю хорошего способа хранить несколько связанных между собой параметров нет. Из плохого: сохранять значения по ключам типа id + "name", id + "date"... ну и id тоже хранить. В общем некрасиво. БД думаю лучше.
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 08:30
IriDolG
Нет, параметры не связаны. К примеру - health, mana, gold . Можно ли их сохранять, не прибегая к использованию БД?
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 09:21
klblk
ну тогда SharedPreferences должно подойти. Можно без бд.
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 09:42
IriDolG
Кажется, я поняла, в чем проблема с отображением. У меня в public void onClick значение переменной health изменяется и с помощью ValueOf помещается в healthvalue, но вероятно это осталось незамеченным в методе saveText. Как это можно исправить?
Код: Выделить всё
public class GameActivity extends Activity implements OnClickListener{
SharedPreferences sPref;
final String SAVED_TEXT = "saved_health";
Button btngame1;
Button btngame2;
Button btngame3;
Button btngame4;
TextView txtnamelocation;
TextView txtgame;
String healthvalue;
String karmavalue;
ImageButton imbtnstat;
int health;
int crystals;
static int uldi;
static int karma;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.game);
TextView txtnamelocation=(TextView)findViewById
(R.id.txtnamelocation);
TextView txtgame=(TextView)findViewById(R.id.txtgame);
Button btngame1=(Button)findViewById(R.id.btngame1);
Button btngame2=(Button)findViewById(R.id.btngame2);
Button btngame3=(Button)findViewById(R.id.btngame3);
Button btngame4=(Button)findViewById(R.id.btngame4);
ImageButton imbtnstat=(ImageButton)findViewById(R.id.imbtnstatus);
txtnamelocation.setText(R.string.gnamelocprolog);
txtgame.setText(R.string.txtprologpart1);
btngame1.setText(R.string.choice1);
btngame2.setText(R.string.choice2);
btngame3.setVisibility(Button.GONE);
btngame4.setVisibility(Button.GONE);
btngame1.setOnClickListener(this);
btngame2.setOnClickListener(this);
imbtnstat.setOnClickListener(this);
health=10;
String healthvalue=String.valueOf(health);
TextView numhealth=(TextView)findViewById(R.id.textnumhealth);
numhealth.setText(healthvalue);
crystals=5;
String crystalsvalue=String.valueOf(health);
TextView numcrystals=(TextView)findViewById(R.id.textnumcryst);
numcrystals.setText(crystalsvalue);
uldi=0;
karma=-3;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int id = v.getId();
if (id == R.id.btngame1) {
TextView txtgame=(TextView)findViewById(R.id.txtgame);
Button btngame1=(Button)findViewById(R.id.btngame1);
Button btngame2=(Button)findViewById(R.id.btngame2);
txtgame.setText(R.string.txtprologchoice1);
btngame1.setVisibility(Button.GONE);
btngame2.setVisibility(Button.GONE);
Button btngame3=(Button)findViewById(R.id.btngame3);
btngame3.setText(R.string.topart1);
uldi=uldi+1;
health=health-1;
String healthvalue=String.valueOf(health);
TextView numhealth=(TextView)findViewById(R.id.textnumhealth);
numhealth.setText(healthvalue);
saveText();
btngame3.setOnClickListener(this);
btngame3.setVisibility(Button.VISIBLE);
OnClickListener oclBtnOk = new OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent
(GameActivity.this, GameCavesActivity.class));
}
};
btngame3.setOnClickListener(oclBtnOk);
}
else if(id == R.id.imbtnstatus) {
startActivity(new Intent(GameActivity.this,
StatusActivity.class));
}
else if(id == R.id.btngame2) {
TextView txtgame=(TextView)findViewById(R.id.txtgame);
Button btngame1=(Button)findViewById(R.id.btngame1);
Button btngame2=(Button)findViewById(R.id.btngame2);
txtgame.setText(R.string.txtprologchoice2);
btngame1.setVisibility(Button.GONE);
btngame2.setVisibility(Button.GONE);
Button btngame3=(Button)findViewById(R.id.btngame3);
btngame3.setText(R.string.topart1);
karma=karma+1;
String karmavalue=String.valueOf(karma);
btngame3.setOnClickListener(this);
btngame3.setVisibility(Button.VISIBLE);
OnClickListener oclBtngame3 = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(GameActivity.this,
GameCavesActivity.class));
}
};
btngame3.setOnClickListener(oclBtngame3);
}
}
void saveText() {
sPref = getSharedPreferences("Stats",MODE_PRIVATE);
Editor edhealth = sPref.edit();
edhealth.putString(SAVED_TEXT,healthvalue);
edhealth.commit();
Toast.makeText(this, "Состояние сохранено", Toast.LENGTH_SHORT).show
();
}
public void onBackPressed() {
startActivity(new Intent(GameActivity.this, MenuActivity.class));
}
}
Продолжение темы о нескольких переменных: как это технически с помощью Preferences можно сделать? Создать файл сохранения для каждой переменной?
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 11:07
klblk
Предположение верно, только почему сами исправить не можете?
у вас 2 переменные healthvalue: глобальная и локальная. Присваеваете вы значение локальной, а в saveText используете глобальную, в которой пусто. и я же просил вывести лог healthvalue при записи в преференс, сразу же был виден null.
Пожалуйста исправте сами, не растраивайте меня совсем.
сохранять это в настройки нужно только для того чтобы отобразить в другой активити? почему бы лучше не передавать через intent тогда?
замечалки:
1) в onClick обработку лучше наверное все-таки switch-case делать
2) String crystalsvalue=String.valueOf(health); тут наверное что-то не так, но это так в глаза бросилось.
3) btngame3 в одном блоке кода присваевается два слушателя, работать будет только последний (btngame3.setOnClickListener)
Re: Не загружает sharedPreferences
Добавлено: 12 мар 2014, 15:05
IriDolG
Спасибо большое! Приступлю к исправлениям!
Re: Не загружает sharedPreferences
Добавлено: 13 мар 2014, 09:43
IriDolG
сохранять это в настройки нужно только для того чтобы отобразить в другой активити? почему бы лучше не передавать через intent тогда?
Это планирую делать для того, чтобы при загрузке состояния игры информация о параметрах игрока откуда-нибудь считывалась. Разве есть другой способ загрузки данных?
Re: Не загружает sharedPreferences
Добавлено: 13 мар 2014, 09:59
klblk
Не я не о том, для сохранения состояния игры и для последующей загрузки это подойдет. Но из контекста я понял, что сохраняется значение в настройки, а потом тут же эти же значение считываются в другой активити. Просто можно в другую активити передать значения и через intent, зачем лишний раз преференс тревожить. С дугой стороны если эту другую активити можно открывать и из других мест приложения, то вероятно сохранение параметров это нормально.
Re: Не загружает sharedPreferences
Добавлено: 13 мар 2014, 11:20
altwin
Если вы сохраняете настройки какой -то игры, к примеру состояние прсонажа, как объекта, гораздо правильней добавить в класс key/value storage вроде:
http://docs.guava-libraries.googlecode. ... BiMap.html Имея set/get методы доступа к нему вы всегда будете иметь доступ к ним там, где обращаетесь к самому объекту. Без лишнего доступа к внешним настройкам. Можно и обычный HashMap использовать, важно то, что свое состоянии объект приносит с собой, а не запрашивает его где -то.