Android에서 Toast를 사용할 때, 메시지가 중복해서 뜨면서 오랫동안 지속되는 경우가 있습니다.

기존 메시지는 삭제하고, 현재 메시지만 보이도록 하는 방법을 공유합니다.

 

1. Toast 객체 선언
public static Toast mToast;

2. onCreate() 에서 Toast.makeText()를 이용하여 Toast 객체 초기화
mToast = Toast.makeText(this, "null", Toast.LENGTH_SHORT);

3. 이 후, Toast를 보여주는 코드에 있는 Toast.makeText().show() 대신 다음으로 변경
mToast.setText(
show this text);

mToast.show();

 

이렇게 수정하면,

l mToast가 보여지지 않던 상황에는, 설정한 string toast를 띄우게 되고,

l mToast가 보여지고 있던 상황에는, mToast에 보여지고 있던 text를 새로운 text로 변경하여 보여줍니다.

항상 가장 마지막에 setText(), show() 했던 text Toast에 보여지게 되며, Toast.LENGTH_SHORT 만큼의 시간이 흐른뒤에 Toast가 사라지게 됩니다.

 

 

 

안드로이드 프로젝트를 진행하면서, 아이디나 String 문자열등 저장해야 할 경우가 생깁니다. 보통의 경우 Data를 저장할 경우 DB를 써야하는데 DB를 쓰기에는 너무 간단하거나 애매한 상황이 생기기도 합니다. 그럴경우에 안드로이드에서 제공하는 SharedPreferences 를 사용하시기 바랍니다.


SharedPreferences는 해당 프로세스(어플리케이션)내에 File 형태로 Data를 저장해 줍니다. 그리고 해당 어플리케이션이 삭제되기 전까지 Data를 보관해 주는 기능을 합니다. (SharedPreferences 사용한 어플리케이션을 지우면 내용이 모두 삭제 됩니다. File이 삭제되는 것이지요.) 자 그럼 사용 방법에 대해 알아 보겠습니다.


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

public class TestSharedPreferencesActivity extends Activity {
         @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);            
}
         // 값 불러오기
    private void getPreferences(){
        SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
        pref.getString("hi", "");
    }
         // 값 저장하기
    private void savePreferences(){
        SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.putString("hi", "인사잘하네");
        editor.commit();
    }
         // 값(Key Data) 삭제하기
    private void removePreferences(){
        SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.remove("hi");
        editor.commit();
    }
         // 값(ALL Data) 삭제하기
    private void removeAllPreferences(){
        SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();
        editor.clear();
        editor.commit();
    }
}
 
 SharedPreferences pref = getSharedPreferences("pref", MODE_PRIVATE);

 

getSharedPreferences("pref", MODE_PRIVATE) 에서 "pref" 는 File 이름이라고 생각하시면 됩니다. 하나의 폴더에 여러개의 File이 존재 할 수 있듯이 하나의 어플리케이션에서도 여러개의 SharedPreferences(File) 가 존재 할 수 있습니다. 그러므로 "pref"는 SharedPreferences 이름이라고 보시면 됩니다.
값을 저장하고 불러올때 SharedPreferences 이름이 틀리지 않게 주의하시면 됩니다.

 


사용하실때는 SharedPreferences 는 (Key, Value) 형태로 사용하시면 됩니다. 불러오실때 getString(key, value)를 설정하지만 해당 key에 대한 값이 없을경우 입력한 Value가 Default 값으로 설정됩니다. 즉 위에 보시는것과 같이 key값이 없을경우 "" 공백을 리턴받게 됩니다.

 


또한 주의하실게 get 메서드를 제외한 Data 저장(put), 삭제(remove, clear) 등을 할 경우에는 commit()을 꼭 호출해 주어야 합니다.

private SharedPreferences _prefs = null;

// SharedPreferences => 환경설정파일 생성하고 관리하기 위한 클래스

SharedPreferences 객체 생성방법

context.getSharedPreferences("PREFS_PRIVATE", Context.MODE_PRIVATE);
// SharedPreferences 객체를 얻기위한 메소드
// "파일명", 파일에 접근할 수 있는 권한
// <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
// <map> </map>

private Editor _editor = null;

// Editor => 환경설정파일의 내용을 수정하기 위한 클래스

Editor 객체 생성방법

SharedPreferences.edit();// Editor 객체를 얻기 위한 메소드

SharedPreferences 가 보유하고 있는 값 추출하는 메서드

SharedPreferences.getString("emailaddress", "Unknown");
// getString() 의 첫번째 값은 ~~.xml에서 <string name="~~">
// getString() 의 두번째 값은
<string>값이 없을 경우 기본값 </string>

SharedPreferences에 값을 넣거나 수정하는 메서드

Editor.putString("emailaddress", newemail);
// putString() => <string></string>
// putString()의 첫번째 값 => <string name="~~~">
// putString()의 두번째 값 => <string>~~~~</string>
// <string name="emailaddress">newemail변수의 값</string>

새로운 값, 변경 내용을 SharedPreferences에 실제로 적용시키는 메서드

Editor..commit();
// this._editor에 보관되어 있는
// <string name="emailaddress">newemail변수의 값</string>
// <string name="serverurl">serverurl변수의 값</string>
// 를 SharedPreferences xml 파일에 적용시키는 메소드

실제 사용한 예

/*
* prefs.java Unlocking Android http://manning.com/ableson Author: W. F. Ableson
* fableson@msiservices.com
*/

package com.msi.manning.UnlockingAndroid;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;

public class Prefs {

private SharedPreferences _prefs = null;
// SharedPreferences => 환경설정파일 생성
private Editor _editor = null;
// Editor => 환경설정파일의 내용을 수정
private String _useremailaddress = "Unknown";
private String _serverurl = "http://android12.msi-wireless.com/getjoblist.php";

public Prefs(Context context) {
this._prefs = context.getSharedPreferences("PREFS_PRIVATE", Context.MODE_PRIVATE);
// SharedPreferences 객체를 얻기위한 메소드
// "파일명", 파일에 접근할 수 있는 권한
// <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
// <map> </map>
this._editor = this._prefs.edit();
// Editor 객체를 얻기 위한 메소드
}
// getValue() => SharedPreferences파일의 내용을 얻기 위한 메소드
public String getValue(String key, String defaultvalue) {
if (this._prefs == null) {
return "Unknown";
}

return this._prefs.getString(key, defaultvalue);
}
// setValue() => SharedPreferences파일에 내용을 저장 위한 메소드
public void setValue(String key, String value) {
if (this._editor == null) {
return;
}

this._editor.putString(key, value);

}
// getEmail() => 계정을 추출하는 메서드
public String getEmail() {
if (this._prefs == null) {
return "Unknown";
}

this._useremailaddress = this._prefs.getString("emailaddress", "Unknown");
// getString() 의 첫번째 값은 ~~.xml에서 <string name="~~">
// getString() 의 두번째 값은 <string>값이 없을 경우 기본값 </string>
return this._useremailaddress;
}
// getServer() => 접속할 URL 주소를 추출하기 위한 메소드
public String getServer() {
if (this._prefs == null) {
return "http://android12.msi-wireless.com/";
}

this._serverurl = this._prefs.getString("serverurl", "http://android12.msi-wireless.com/");
return this._serverurl;
}
// setEmail(입력된 사용자계정) =>입력된 사용자계정을 저장하는 메서드
public void setEmail(String newemail) {
if (this._editor == null) {
return;
}

this._editor.putString("emailaddress", newemail);
// putString() => <string></string>
// putString()의 첫번째 값 => <string name="~~~">
// putString()의 두번째 값 => <string>~~~~</string>
// <string name="emailaddress">newemail변수의 값</string>
}
// setServer(입력된 URL주소) => 입력된 URL주소를 저장하는 메소드
public void setServer(String serverurl) {
if (this._editor == null) {
return;
}
this._editor.putString("serverurl", serverurl);
// putString() => <string></string>
// putString()의 첫번째 값 => <string name="~~~">
// putString()의 두번째 값 => <string>~~~~</string>
// <string name="serverurl">serverurl변수의 값</string>
}
// save() => 실제로 ~~.xml 파일에 저장하는 메소드
public void save() {
if (this._editor == null) {
return;
}
this._editor.commit();
// this._editor에 보관되어 있는
// <string name="emailaddress">newemail변수의 값</string>
// <string name="serverurl">serverurl변수의 값</string>
// 를 SharedPreferences xml 파일에 적용시키는 메소드
}
}

실습예제

프로젝트 새롭게 만들고, 메인화면에 아래와 같이 구성...

ToggleButton => 사운드 (기본값 : On)
EditText => 아이디 (기본값 : default)
EditText => 비밀번호 (기본값 : default)

CheckBox => 아이디저장 (기본값 : 체크해제)
CheckBox => 비밀번호저장 (기본값 : 체크해제)

Button => 확인

확인버튼을 누르면 SharedPreferences 파일에

현재 사운드의 On/Off 상태 값, 체크박스에 체크한 값들은 (아이디, 비밀번호) 저장할 수 있도록 코드 작성....
(단, 다시 어플리케이션을 실행하면 현재 SharedPreferences 파일에

저장된 값으로 실행되어야 함..)