어플을 개발하다보면 아래와 같이 공지사항 형식의 dialog를 많이 볼 수 있다.
그러니까, 처음 실행시 해당경고사항에 대해 팝업을 띄워주고 다시보지 않음과 같은 버튼을 만들어서 해당 버튼을 클릭하면 다음부터는 실행하지 않는 것인데, 의외로 구현하기가 거시기한 항목중 하나였다.
간단히 말 해서, dialog와 SharedPreference를 함께 쓰는 것이었다.
sharePreference는 어플리케이션의 "설정"창에서 흔히 볼 수 있는 부분인데, 이에 대한 선행이해가 필요할 것이나, 무작정 따라해서 구현할 수도 있기 때문에 일단 적어본다.
개략적인 구성은 아래와 같다.
Preference 항목을 두 개를 만든다고 가정하자, 각각 A와 B 이다.
어플이 실행될 때 마다 A Preference에 어플 버전을 저장하고 dialog를 호출할 때 A Preference와 B(초기값 null) Preference를 비교하여, A와 B가 다르면 dialog를 보여준다.
[다시보지 않기] 버튼을 클릭할 경우, 어플리케이션 버전을 B Preference에 저장한다.
결론적으로 어플이 실행될 때 [다시보지 않기]를 클릭한 경우, 저장된 A와 B가 서로 같기 때문에 dialog를 출력하지 않는다.
만약 어플리케이션 버전업을 할 경우, A Preference에는 새로운 버전이 저장되며, B Preference에는 기존의 버전이 저장되기 때문에 A와 B가 다르고, 다르기 때문에 dialog를 다시 보여준다.
약간 이해가 어려울 지 모르겠지만 뭐 상관없다.
그럼 개략적인 소스를 살펴보자.
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String version;
try {
PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);
version = i.versionName;
} catch (NameNotFoundException e) {
version = "";
}
SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); // UI 상태를 저장합니다.
SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다
editor.putString("check_version", version); // 저장할 값들을 입력합니다.
editor.commit(); // 저장합니다.
String check_version = pref.getString("check_version", "");//
String check_status = pref.getString("check_status", "");
if (!check_version.equals(check_status)) {
AlertDialog alert = new AlertDialog.Builder(this).setIcon(R.drawable.icon)
.setTitle(R.string.app_notice)
.setMessage(R.string.app_notice_update)
.setPositiveButton(R.string.app_notice_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setNegativeButton(R.string.app_notice_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String version;
try {
PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);
version = i.versionName;
} catch (NameNotFoundException e) {
version = "";
}
SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
// UI 상태를 저장합니다.
SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다
editor.putString("check_status", version);
editor.commit(); // 저장합니다.
dialog.cancel();
}
}).show();
}
}
그럼 이제 소스를 차분히 뜯어보자.
String version;
try {
PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);
version = i.versionName;
} catch (NameNotFoundException e) {
version = "";
}
이 부분은 어플리케이션의 버전을 저장하는 부분이다. version 이라는 항목에 String 값으로 저장된다.
SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE); // UI 상태를 저장합니다.
SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다
editor.putString("check_version", version); // 저장할 값들을 입력합니다.
editor.commit(); // 저장합니다.
주석이 잘 달려있기 때문에 크게 설명할 부분이 없다.
check_version 항목에 현재 어플리케이션 버전을 저장한다.
String check_version = pref.getString("check_version", "");//
String check_status = pref.getString("check_status", "");
여기서부터가 이제 중요하다.
저장된 check_version과 check_status를 가져온다.
check_version은 윗부분에서 현재 어플리케이션을 저장했으며, check_status에서는 아무것도 저장되지 않았기 때문에 null값이 들어간다.
if (!check_version.equals(check_status)) {
check_version과 check_status를 비교한다. string 형이기 때문에 .equals로 비교를 하며, 서로 값이 다를 때를 가정하기 때문에 check_version 앞에 !를 붙인다.
AlertDialog alert = new AlertDialog.Builder(this).setIcon(R.drawable.icon)
.setTitle(R.string.app_notice)
.setMessage(R.string.app_notice_update)
.setPositiveButton(R.string.app_notice_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
해당 부분은 dialog 부분이기 때문에 설명 없이 넘어간다.
해당 부분은 ok 버튼을 클릭했을 때를 나타낸다.
.setNegativeButton(R.string.app_notice_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
[다시보지 않음] 항목을 클릭했을 때를 정의한다.
String version;
try {
PackageInfo i = getPackageManager().getPackageInfo(getPackageName(), 0);
version = i.versionName;
} catch (NameNotFoundException e) {
version = "";
}
현재 어플리케이션 버전값을 읽어오기 위한 version 체크 부분이다.
SharedPreferences pref = getSharedPreferences("pref", Activity.MODE_PRIVATE);
// UI 상태를 저장합니다.
SharedPreferences.Editor editor = pref.edit(); // Editor를 불러옵니다
editor.putString("check_status", version);
editor.commit(); // 저장합니다.
dialog.cancel();
SharedPreference의 pref에 아래의 내용을 저장한다.
check_status에 위에서 호출한 version 값을 저장하고 dialog를 cancle 한다.
이로써 다시보지 않음 dialog를 정의하는 방법에 대해 알아보았다.
negative 버튼을 클릭하였을 때 현재 버전을 check_status에 저장하고, 어플리케이션을 다시 실행하였을 때, check_version과 check_status를 비교하여 같으면 보이지 않고, 다르면 보이는 코드는 이처럼 구현된다.
물론 중복되는 소스도 있고 확실히 좀 더 줄일 수 있는 부분이 몇군데 보이지만 현재로써는 내가 할 수 있는 부분은 이와 같다.