Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[50일차 Android] Preferences Screen 본문

Computer/Android

[50일차 Android] Preferences Screen

Wise-99 2023. 7. 17. 20:48

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

 

 

📖 Preferences Screen

  • UI를 통해서 Preferences를 사용할 수 있도록 제공되는 개념
  • PreferenceFragment를 사용하며 저장 기능까지 모두 구현되어 있다.
  • andoridx.preferences를 사용하여 구현한다.

 

 

 

주요 속성(xml / pref.xml)

EditTextPreference

EditTextPreference(문자열 입력)
defaultValue 초기 값
title 화면에 보여지는 이름
key 데이터를 가져올 때 사용하는 이름
summary 표시되는 설명
icon 좌측에 표시될 아이콘
dialogIcon 입력을 위해 뜨는 다이얼로그의 아이콘
dialogTitle 입력을 위해 뜨는 다이얼로그의 타이틀
dialogMessage 입력을 위해 뜨는 다이얼로그의 메시지
dependency true / false를 저장하는 요소의 값에 따라 활성화 / 비활성화가 설정됨

 

 


CheckBoxPreference

 

CheckBoxPreference
defaultValue
초기 값
key 데이터를 가져올 때 사용하는 이름
title 화면에 보여지는 이름
summary 표시되는 설명
icon 좌측에 표시될 아이콘
summaryOff 체크 해제 되어 있을 때 보여줄 설명
summaryOn 체크 되어 있을 때 보여줄 설명
dependency true / false를 저장하는 요소의 값에 따라 활성화 / 비활성화가 설정됨

 


SwitchPreference

 

SwitchPreference
defaultValue 초기 값
key 데이터를 가져올 때 사용하는 이름
title 화면에 보여지는 이름
summary 표시되는 설명
icon 좌측에 표시될 아이콘
summaryOff off 상태 있을 때 보여줄 설명
summaryOn on 상태 있을 때 보여줄 설명
dependency true / false를 저장하는 요소의 값에 따라 활성화 / 비활성화가 설정됨

 


ListPreference

 

ListPreference
defaultValue 초기 값
key 데이터를 가져올 때 사용하는 이름
title 화면에 보여지는 이름
icon 좌측에 표시될 아이콘
summary 표시되는 설명
dialogIcon 입력을 위해 뜨는 다이얼로그의 아이콘
entries 화면상에 보여줄 항목의 문자열
entryValues 코드에서 사용할 값

 

 


MultiSelectListPreference

 

MultiSelectListPreference
defaultValue 초기 값
key 데이터를 가져올 때 사용하는 이름
title 화면에 보여지는 이름
icon 좌측에 표시될 아이콘
summary 표시되는 설명
dialogIcon 입력을 위해 뜨는 다이얼로그의 아이콘
entries 화면상에 보여줄 항목의 문자열
entryValues 코드에서 사용할 값

 

 


예제 코드

MainActivity.kt

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    // 교체할 프래그먼트 목록
    companion object{
        val SETTING_FRAGMENT = "SettingFragment"
        val RESULT_FRAGMENT = "ResultFragment"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        activityMainBinding.run{
            button.setOnClickListener {
                replaceFragment(SETTING_FRAGMENT, false, false, null)
            }

            button2.setOnClickListener {
                replaceFragment(RESULT_FRAGMENT, false, false, null)
            }
        }

        replaceFragment(SETTING_FRAGMENT, false, false, null)
    }

    // 지정한 Fragment를 보여주는 메서드
    fun replaceFragment(name:String, addToBackStack:Boolean, animate:Boolean, bundle:Bundle?){
        // Fragment 교체 상태로 설정한다.
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        // 새로운 Fragment를 담을 변수
        var newFragment = when(name){
            SETTING_FRAGMENT -> SettingFragment()
            RESULT_FRAGMENT -> ResultFragment()
            else -> Fragment()
        }

        newFragment.arguments = bundle

        if(newFragment != null) {
            // Fragment 교체
            fragmentTransaction.replace(R.id.mainContainer, newFragment)

            if (animate == true) {
                // 애니메이션 설정
                fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
            }

            if (addToBackStack == true) {
                // Fragment를 Backstack에 넣어 이전으로 돌아가는 기능이 동작할 수 있도록 한다.
                fragmentTransaction.addToBackStack(name)
            }

            // 교체 명령
            fragmentTransaction.commit()
        }
    }

    // Fragment를 BackStack에서 제거
    fun removeFragment(name:String){
        supportFragmentManager.popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE)
    }
}

 

 

 

SettingFragment.kt

class SettingFragment : PreferenceFragmentCompat() {

    // PreferenceScreen이 생성될 때 호출
    // PreferenceScreen을 구성하기 위한 xml 파일 지정
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.pref, rootKey)
    }
}

 

 

 

 

class ResultFragment : Fragment() {

    lateinit var fragmentResultBinding: FragmentResultBinding
    lateinit var mainActivity: MainActivity

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        fragmentResultBinding = FragmentResultBinding.inflate(inflater)
        mainActivity = activity as MainActivity

        // Preferences를 가져온다.
        val pref = PreferenceManager.getDefaultSharedPreferences(mainActivity)

        // 저장된 데이터를 가져온다.
        
        // EditTextPreference
        val data1 = pref.getString("data1", null)
        
        // CheckBoxPreference
        val data2 = pref.getBoolean("data2", false)
        
        // SwitchPreference
        val data3 = pref.getBoolean("data3", false)
        
        // ListPreference
        val data4 = pref.getString("data4", null)
        
        // MultiListPreference
        val data5 = pref.getStringSet("data5", null)

        fragmentResultBinding.run{
            textViewResult.text = "data1 : ${data1}\n"
            textViewResult.append("data2 : ${data2}\n")
            textViewResult.append("data3 : ${data3}\n")
            textViewResult.append("data4 : ${data4}\n")

            for(a1 in data5!!){
                textViewResult.append("data5 : ${a1}\n")
            }
        }

        return fragmentResultBinding.root
    }
}

 

 

 

결과