Урок 33. Хранение данных. Preferences.

Обсуждение уроков
math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 15 авг 2012, 10:48

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

base = base.substring(1,base.length()-1);
Stings[] mas = base.split(", "); // возможно, нужно "\\, "

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 15 авг 2012, 11:41

А лучше:

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

ed.putStringSet(Save_Arrays,new LinkedHashSet<String>(Arrays.asList(mas)));
Set<String> set = sPref.getStringSet(Save_Arrays, null);
String[] mas = set == null ? new String[0] : set.toArray(new String[set.size()]);

3Gern
Сообщения: 25
Зарегистрирован: 30 июл 2012, 13:32

Re: Урок 33. Хранение данных. Preferences.

Сообщение 3Gern » 15 авг 2012, 18:41

math64
сделал добавив дополнительные переменные.

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 15 авг 2012, 19:34

Как - через split() или через putStringSet() ? Если у тебя массив строк, то как у меня, больше ничего не нужно.
Если массив другого типа - нужна доп. конвертация String в этот тип.

RightBuilder
Сообщения: 2
Зарегистрирован: 13 авг 2012, 15:01

Re: Урок 33. Хранение данных. Preferences.

Сообщение RightBuilder » 17 авг 2012, 15:27

"Теперь если мы посмотрим исходники метода getPreferences, то видим следующее:", где посмотреть эти исходники? и исходники всего класса Activity например?

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 17 авг 2012, 18:47

RightBuilder писал(а):"Теперь если мы посмотрим исходники метода getPreferences, то видим следующее:", где посмотреть эти исходники? и исходники всего класса Activity например?
Исходники есть на четрвёрку (Ice Cream). Скачивай оттуда же, откуда и SDK - c помощью Android SDK Manager.
Исходники ресурсов есть в каталоге andriod-sdk/platforms/android-N/data/res для всех платформ.

RightBuilder
Сообщения: 2
Зарегистрирован: 13 авг 2012, 15:01

Re: Урок 33. Хранение данных. Preferences.

Сообщение RightBuilder » 17 авг 2012, 21:05

по этому пути xml-ки лежат, нашёл тут AndroidSDK\sources\android-14\android
Спасибо

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 33. Хранение данных. Preferences.

Сообщение caHek2x » 04 сен 2012, 21:31

добрый день, помогите разобраться что делаю не правильно... все уроки получаются всё работает но в списке приложений все приложения называются MainActivity где я что ввожу не так ... ?
Изображение
Изображение

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 33. Хранение данных. Preferences.

Сообщение rezak90 » 04 сен 2012, 21:54

саНек2х имя приложения меняется в манифесте:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
в android:label="9I_KPEBEDKO"
R.id.team
Политика на форуме запрещена

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 33. Хранение данных. Preferences.

Сообщение caHek2x » 05 сен 2012, 01:33

rezak90 писал(а):саНек2х имя приложения меняется в манифесте:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
в android:label="9I_KPEBEDKO"
Проблема в том что имя в манифесте норм ...
тоесть там android:label="@string/app_name"
а если зайти в res/values/strings.xml то увидем <string name="app_name">SimpleSQLite</string>
почему тогда в списке приложений название главного активити стоит а не SimpleSQLite ... ???
а да и что самое интерестное что в менеджере приложений с названиями всё ок ...
Изображение

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 33. Хранение данных. Preferences.

Сообщение math64 » 05 сен 2012, 07:20

попробуй добавить android:label="@string/app_name" в объявление MainActivity:

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

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
  <activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
      <action android:name="android.intent.action.MAIN"/>
      <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
  </activity>
</application>

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 33. Хранение данных. Preferences.

Сообщение AndreyI » 05 сен 2012, 08:20

Все правильно, в пределах одного приложения может быть несколько запускаемых Activity с фильтром
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

поэтому в лаунчере отображаются не имя приложения, а имена этих Activity, если для них не указан android:label в манифесте, то в качестве имени используется имя класса.

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 33. Хранение данных. Preferences.

Сообщение caHek2x » 05 сен 2012, 13:45

AndreyI писал(а):Все правильно, в пределах одного приложения может быть несколько запускаемых Activity с фильтром
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

поэтому в лаунчере отображаются не имя приложения, а имена этих Activity, если для них не указан android:label в манифесте, то в качестве имени используется имя класса.
тоесть если у меня 3 активити с фильтром в одном приложении у меня эти все три активити в списке приложений появятся ???

Аватара пользователя
caHek2x
Сообщения: 35
Зарегистрирован: 04 сен 2012, 21:15

Re: Урок 33. Хранение данных. Preferences.

Сообщение caHek2x » 05 сен 2012, 13:49

math64 писал(а):попробуй добавить android:label="@string/app_name" в объявление MainActivity:
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
.........
спасибо так изменилось название в списке приложений ...

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 33. Хранение данных. Preferences.

Сообщение AndreyI » 05 сен 2012, 14:47

caHek2x писал(а): тоесть если у меня 3 активити с фильтром в одном приложении у меня эти все три активити в списке приложений появятся ???
Все активити с фильтром
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
будут отображаться в лаунчере, даже если их будет 100500 в приложении.


ЗЫ В АDT 20 при создании активити через мастер New "Android Activity" (вещь вроде удобная) автоматом проставлялся этот фильтр в манифест, приходилось удалять ручками. В ADT 21 эту багу поправили, теперь при создании активити добавили специальную опцию для этого.

Roman
Сообщения: 22
Зарегистрирован: 23 авг 2012, 08:43

Re: Урок 33. Хранение данных. Preferences.

Сообщение Roman » 10 сен 2012, 12:37

AndreyI писал(а):
caHek2x писал(а): В ADT 21 эту багу поправили, теперь при создании активити добавили специальную опцию для этого.
А откуда вы скачивали 21 версию?
Последняя версия ADT 20.0.3 (August 2012)
Да и я бы на вашем месте подумал перед тем как заменять строку

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

android:label="@string/title_activity_main" >
на

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

android:label="@string/app_name"
в activity Манифеста. Как уже тут говорили можно вывести несколько активити вашего приложения в список, чтобы уменьшить количество кликов для юзера к нужному разделу вашего приложения. Лучше просто в стрингс заменить значение title_activity_main, оно у вас сейчас просто MainActivity

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Урок 33. Хранение данных. Preferences.

Сообщение AndreyI » 10 сен 2012, 13:05

Roman писал(а): А откуда вы скачивали 21 версию?
Последняя версия ADT 20.0.3 (August 2012)
Она находится на стадии тестирования, здесь подробно описано как скачивать для предварительного просмотра ADT и SDK и как сделать откат на релизовые версии в случае чего.
http://tools.android.com/preview-channel

Ivan
Сообщения: 3
Зарегистрирован: 29 сен 2012, 00:11

Re: Урок 33. Хранение данных. Preferences.

Сообщение Ivan » 03 окт 2012, 20:53

Доброе время суток!
Подскажите как реализовать сохранность UI?
Поясняю:
К примеру есть кнопка, по нажатию на которую добавляется поле ввода на экран.
как сделать что бы поле не осчезало во время onPause(), onDestroy() и т.д.

есть одна идея но она кажется мне глупой, по-этому не спешу реализовывать ее в своем приложении)))

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 33. Хранение данных. Preferences.

Сообщение rezak90 » 03 окт 2012, 21:24

1) Если поле одно (а не куча их), то можно изначально его разместить и сделать invisible, и потом при нажатии на кнопку делать его visible. В Preferences сохранять его состояние и при загрузки активити заново проверять состояние этого поля, если true то показывать его;
2) Сделать создание поля динамическим. Нажали на кнопку - создали EditText(или что там у вас) и добавили его к лейауту. Потом опять таки хранить его состояние в Preferences.
R.id.team
Политика на форуме запрещена

Ivan
Сообщения: 3
Зарегистрирован: 29 сен 2012, 00:11

Re: Урок 33. Хранение данных. Preferences.

Сообщение Ivan » 04 окт 2012, 10:41

rezak90 писал(а):1) Если поле одно (а не куча их), то можно изначально его разместить и сделать invisible, и потом при нажатии на кнопку делать его visible. В Preferences сохранять его состояние и при загрузки активити заново проверять состояние этого поля, если true то показывать его;
2) Сделать создание поля динамическим. Нажали на кнопку - создали EditText(или что там у вас) и добавили его к лейауту. Потом опять таки хранить его состояние в Preferences.
Спасибо за оперативность!)
Первый пункт сразу отпадает, а вот со вторым, если можно, поподробней.

Накидал тут тестовую прогу, но не работает.
В коде выделен предположительно нерабочий фрагмент "!!!!!" (я ее не дебажил).

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LLmain"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="addButton" />

</LinearLayout>

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

package com.example.aaaaaatestsave;

import java.util.concurrent.Semaphore;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
	Button addBtn;
	Button someBtn;
	LinearLayout LLmain;
	String btnName;
	int btnCount = 0;
	SharedPreferences sPref;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        LLmain = (LinearLayout) findViewById(R.id.LLmain);
        addBtn = (Button) findViewById(R.id.button1);
        addBtn.setOnClickListener(this);
        
    }
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        btnCount = savedInstanceState.getInt("btnCount");
    }
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt("btnCount", btnCount);
    }
    public void onPause(){
    	super.onPause();
    	saveState();
    }
    public void onResume(){
    	super.onResume();
        if (btnCount != 0) loadState();
    }
    
    void saveState() {
        sPref = getPreferences(MODE_PRIVATE);
        Editor ed = sPref.edit();
        for (int i = 1; i<btnCount; i++){
            ed.putInt("Button" + i, i);
        }
        ed.commit();
      }
      
      void loadState() {
        sPref = getPreferences(MODE_PRIVATE);
        for (int i = 0; i<btnCount; i++){
        	someBtn = (Button) findViewById(i); // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        	LLmain.addView(someBtn);
        }
        Toast.makeText(this, "Text loaded", Toast.LENGTH_SHORT).show();
      }
    private void addSomeButton(){
    	someBtn = new Button(this);
    	someBtn.setText("Button" + ++btnCount);
    	someBtn.setId(btnCount);
    	btnName = String.valueOf(someBtn.getText());
    	LLmain.addView(someBtn);
    }
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.button1:
			addSomeButton();
			break;
		}
		
	}
}
так вы имели ввиду сохранять состояние, или я написал "говнокод" :D

Ответить