Не загружает sharedPreferences

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Не загружает sharedPreferences

Сообщение IriDolG » 11 мар 2014, 06:41

Создала две активити. В первой сохраняю данные:

Код: Выделить всё

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);
Когда-нибудь я научусь!

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Re: Не загружает sharedPreferences

Сообщение IriDolG » 11 мар 2014, 06:53

Изменила edhealth.putString(SAVED_TEXT, healthvalue); . Вместо healthvalue выставила обычное число - оно отображается во второй активити. Подскажите, в чем проблема с healthvalue?
Когда-нибудь я научусь!

siberprogs
Сообщения: 93
Зарегистрирован: 05 мар 2014, 06:20

Re: Не загружает sharedPreferences

Сообщение siberprogs » 11 мар 2014, 07:59

А это вы используете?
[syntax=java]import android.content.Context;[/syntax]
Попробуйте так:
[syntax=java]sPref = getSharedPreferences("Stats",Context.MODE_PRIVATE); [/syntax]
Linux Fedora RFRemix + Intellij Idea

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Не загружает sharedPreferences

Сообщение klblk » 11 мар 2014, 08:09

IriDolG писал(а):Изменила edhealth.putString(SAVED_TEXT, healthvalue); . Вместо healthvalue выставила обычное число - оно отображается во второй активити. Подскажите, в чем проблема с healthvalue?
если число сохраняется нормально, значит проблема видимо в healthvalue и нужно смотреть, что происходит по коду "выше". Оно точно не пустое? попробуйте вывести лог перед записью в настройки.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Не загружает sharedPreferences

Сообщение klblk » 11 мар 2014, 08:15

siberprogs писал(а):А это вы используете?
[syntax=java]import android.content.Context;[/syntax]
Попробуйте так:
[syntax=java]sPref = getSharedPreferences("Stats",Context.MODE_PRIVATE); [/syntax]
В этом нет необходимости "внутри" Activity, т.к. она является наследником Context.

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Re: Не загружает sharedPreferences

Сообщение IriDolG » 12 мар 2014, 04:30

Логи использую - все нормально. Причем healthvalue это string, полученный из переменной health (с помощью valueOf). Эта строка у меня также отображается при нажатии на кнопку в TextView (что дополнительно и вызывает сохранение), поэтому можно отследить, что она не пустая. Бьюсь над этим уже долго. Тем более, что сохранение параметров это ключевая проблема в игре.
PS: такой еще вопрос - как можно сохранить несколько параметров с помощью Preferences? Упорно не понимаю SQLite. Даже, использовав код с соответствующего урока, он почему-то не заработал у меня (при нажатии на кнопки ничего не происходило).
Когда-нибудь я научусь!

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Не загружает sharedPreferences

Сообщение klblk » 12 мар 2014, 06:04

Какие-то непонятные проблемы "ниоткуда" у вас берутся.
у себя проверил:
[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 тоже хранить. В общем некрасиво. БД думаю лучше.

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Re: Не загружает sharedPreferences

Сообщение IriDolG » 12 мар 2014, 08:30

Нет, параметры не связаны. К примеру - health, mana, gold . Можно ли их сохранять, не прибегая к использованию БД?
Когда-нибудь я научусь!

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Не загружает sharedPreferences

Сообщение klblk » 12 мар 2014, 09:21

ну тогда SharedPreferences должно подойти. Можно без бд.

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Re: Не загружает sharedPreferences

Сообщение IriDolG » 12 мар 2014, 09:42

Кажется, я поняла, в чем проблема с отображением. У меня в 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 можно сделать? Создать файл сохранения для каждой переменной?
Когда-нибудь я научусь!

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Не загружает sharedPreferences

Сообщение klblk » 12 мар 2014, 11:07

Предположение верно, только почему сами исправить не можете?
у вас 2 переменные healthvalue: глобальная и локальная. Присваеваете вы значение локальной, а в saveText используете глобальную, в которой пусто. и я же просил вывести лог healthvalue при записи в преференс, сразу же был виден null.
Пожалуйста исправте сами, не растраивайте меня совсем.
сохранять это в настройки нужно только для того чтобы отобразить в другой активити? почему бы лучше не передавать через intent тогда?

замечалки:
1) в onClick обработку лучше наверное все-таки switch-case делать
2) String crystalsvalue=String.valueOf(health); тут наверное что-то не так, но это так в глаза бросилось.
3) btngame3 в одном блоке кода присваевается два слушателя, работать будет только последний (btngame3.setOnClickListener)

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Re: Не загружает sharedPreferences

Сообщение IriDolG » 12 мар 2014, 15:05

Спасибо большое! Приступлю к исправлениям!
Когда-нибудь я научусь!

Аватара пользователя
IriDolG
Сообщения: 46
Зарегистрирован: 10 фев 2014, 09:23

Re: Не загружает sharedPreferences

Сообщение IriDolG » 13 мар 2014, 09:43

сохранять это в настройки нужно только для того чтобы отобразить в другой активити? почему бы лучше не передавать через intent тогда?
Это планирую делать для того, чтобы при загрузке состояния игры информация о параметрах игрока откуда-нибудь считывалась. Разве есть другой способ загрузки данных?
Когда-нибудь я научусь!

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: Не загружает sharedPreferences

Сообщение klblk » 13 мар 2014, 09:59

Не я не о том, для сохранения состояния игры и для последующей загрузки это подойдет. Но из контекста я понял, что сохраняется значение в настройки, а потом тут же эти же значение считываются в другой активити. Просто можно в другую активити передать значения и через intent, зачем лишний раз преференс тревожить. С дугой стороны если эту другую активити можно открывать и из других мест приложения, то вероятно сохранение параметров это нормально.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Не загружает sharedPreferences

Сообщение altwin » 13 мар 2014, 11:20

Если вы сохраняете настройки какой -то игры, к примеру состояние прсонажа, как объекта, гораздо правильней добавить в класс key/value storage вроде: http://docs.guava-libraries.googlecode. ... BiMap.html Имея set/get методы доступа к нему вы всегда будете иметь доступ к ним там, где обращаетесь к самому объекту. Без лишнего доступа к внешним настройкам. Можно и обычный HashMap использовать, важно то, что свое состоянии объект приносит с собой, а не запрашивает его где -то.
Изображение

Ответить