보통 앱을 보면 설정 화면이 있을 것이다. 그 옵션을 쉽게 구현하는 것을 알아보겠다.
PreferenceFragment (설정화면 & 저장 기능)
<최종 화면들>
이제 하나씩 옵션을 추가하면서 만들어 보자.
우선 PreferenceFragment를 상속받은 fragment를 만들자.
알람음 리스트가 필요하다.
이 예제에서는 소리파일 대신에 그냥 텍스트로 대신하였다.
<지금까지 코드 실행 화면>
어떤 항목을 끄면 같이 설정이 못하는 그런...옵션
이제 새로운 액티비티로 전화하는 옵션을 만들자(이미지가 나오는 Activity).
미리 화면에 나올 이미지를 drawable에 추가했다.
이제 옵션을 눌렀을 때 동작을 하려면 리스너를 달아야 한다. 간단하게 리스너를 달겠다.
소리 알림에만 Toast를 달았다. 소리 알림을 On/Off를 할때마다 Toast가 나온다.
<복붙용 코드>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 설정화면 전용 Fragment -->
<fragment
android:id="@+id/frag_setting"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.lcw.ex88preferencefragment.SettingFragment"/>
</RelativeLayout>
MainActivity.java
package com.lcw.ex88preferencefragment;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
arrays.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="sounds">
<item>톡톡</item>
<item>툭툭</item>
<item>파라밤</item>
<item>두두둑</item>
</string-array>
<string-array name="favors">
<item>여행</item>
<item>독서</item>
<item>운동</item>
<item>멍때리기</item>
</string-array>
</resources>
setting.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<SwitchPreference
android:key="vibrate"
android:title="진동알림"
android:summary="메세지가 왔을때 진동울림으로 알림을 받으려면 체크하세요."/>
<CheckBoxPreference
android:key="message"
android:title="소리 알림"
android:summary="소리로 알림을 받으려면 체크하세요."/>
<EditTextPreference
android:key="nickName"
android:title="닉네임"
android:summary="닉네임을 설정하세요."/>
<!-- Single Choice : RadioButton -->
<ListPreference
android:key="sound"
android:title="알림음"
android:summary="알림음을 설정합니다."
android:entries="@array/sounds"
android:entryValues="@array/sounds"/>
<!-- entries : 리스트에 표시되는 항목글씨-->
<!-- entryValues : 파일에 저장되는 값 -->
<!-- Multiple Choice : Checkbox-->
<MultiSelectListPreference
android:key="favor"
android:title="Favorites"
android:summary="좋아하는 항목들을 선택하세요(복수선택 가능)"
android:entries="@array/favors"
android:entryValues="@array/favors"/>
<RingtonePreference
android:key="ringtone"
android:title="choose alarm"
android:summary="알림음을 선택하세요."
android:icon="@android:drawable/ic_menu_help"/>
<!-- 카테고리 구분 형태-->
<PreferenceCategory
android:title="디버깅">
<SwitchPreference
android:key="debugging"
android:title="USB 디버깅"
android:summary="usb가 연결되었을 경우 디버그 모드 사용"
android:defaultValue="true"/>
<!-- 다른 설정값에 따라 활성화여부 -->
<CheckBoxPreference
android:key="usb_app"
android:title="USB로 설치된 앱 확인"
android:summary="usb디버그를 통해 설치된 앱의 목록을 확인합니다."
android:dependency="debugging"/>
<!-- dependency : 속성에 설정한 key값에 해당하는 preference의 true, false 여부에 따라 활성화-->
</PreferenceCategory>
<!-- PreferenceScreen 을 중첩으로 넣으면 새로운 창으로 보여줌-->
<!-- 인텐트를 넣으면 새로운 Component 실행 가능-->
<PreferenceScreen
android:title="이미지 보기">
<intent android:targetPackage="com.lcw.ex88preferencefragment"
android:targetClass="com.lcw.ex88preferencefragment.ImageActivity"/>
</PreferenceScreen>
<PreferenceScreen
android:title="네트워크"
android:summary="네트워크 설정을 합니다.">
<SwitchPreference
android:key="roaming"
android:title="데이터 로밍"
android:summaryOn="로밍이 되어 있으므로 과금이 있습니다."
android:summaryOff="로밍 시에 로밍서비스 연결"/>
</PreferenceScreen>
</PreferenceScreen>
SettingFragment.java
package com.lcw.ex88preferencefragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.EditTextPreference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.widget.Toast;
import androidx.annotation.Nullable;
import java.util.Set;
public class SettingFragment extends PreferenceFragment {
SharedPreferences pref;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//별도의 화면 레이아웃파일(layout폴더)을 사용하지 않고
//설정 xml문서를 총해 화면이 자동 생성
//res폴더 안에 xml폴더 안에 .xml문서를 만들고
//<PregerenceScreen>클래스를 통해 화면 설계 시작..
addPreferencesFromResource(R.xml.setting);
//SharedPreference객체를 참조하여 설정상태에 대한 제어 가능..
pref =PreferenceManager.getDefaultSharedPreferences(getActivity());
//key 값이 "message"인 설정의 저장값 가져오기.
boolean isMessage= pref.getBoolean("message", false); //두번째 파라미터 : default값
Toast.makeText(getActivity(), "소리알림"+isMessage, Toast.LENGTH_SHORT).show();
}// onCreate() ..
@Override
public void onResume() {
super.onResume();
//설정값 변경리스너..등록
pref.registerOnSharedPreferenceChangeListener(listener);
}//onResume() ..
@Override
public void onPause() {
super.onPause();
pref.unregisterOnSharedPreferenceChangeListener(listener);
}
//설정값 변경리스너 객체 맴버변수
SharedPreferences.OnSharedPreferenceChangeListener listener= new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if(key.equals("message")){
boolean b= pref.getBoolean("message", false);
Toast.makeText(getActivity(), "소리알림 : "+ b, Toast.LENGTH_SHORT).show();
}else if(key.equals("vibrate")){
}else if(key.equals("nickName")){
EditTextPreference ep= (EditTextPreference) findPreference(key);
ep.setSummary(pref.getString(key, ""));
}else if(key.equals("favor")){
Set<String> datas= pref.getStringSet(key, null);
}
}
};
}
ImageActivity.java
package com.lcw.ex88preferencefragment;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class ImageActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);
}
}
activity_Image.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ImageActivity">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gametitle_09"/>
</RelativeLayout>
'안드로이드 웹앱 콘테츠 개발자 양성(국비지원) > Fragment' 카테고리의 다른 글
Android Studio Fragment + Pager 2 (0) | 2019.09.26 |
---|---|
Android Studio Fragment + Pager 1 (0) | 2019.09.26 |
Android Studio Fragment 2(View+Activity) (0) | 2019.09.26 |
Android Studio Fragment 1(View+Activity) (0) | 2019.09.26 |
댓글