본문 바로가기
안드로이드 웹앱 콘테츠 개발자 양성(국비지원)/Fragment

Android Studio(화면) PreferenceFragment (설정화면 & 저장)

by 차누감 2019. 10. 29.

보통 앱을 보면 설정 화면이 있을 것이다. 그 옵션을 쉽게 구현하는 것을 알아보겠다.

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>


 

댓글