본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-04-01안드로이드 스튜디오(프래그먼트2)

반응형

어제 공부한 내용의 연장선이다 . 

 

요즘 개발자들이 프래그먼트를 활용한 작업들을 많이 하다보니 다양한 종류의 프래그먼트가 있다 

PreferenceFragmentCompat  상속받아 사용 

별도의 xml을 만들어서 사용해주어야 한다. 

상태 변경시 자동저장이라고 나와있는데 sharedPreference에 저장된다 

sharedPreference는 번들형으로 저장이 되는데 키값으로 가져올수 있는데 여기도 똑같이 키값을 적어 사용해준다 

 

위의 긴 코드는 설정화면 단위이다. 이제 코드를 보면서 이해를 하도록 하자 

 

일단 실습을 하기위하여 필요한 xml 과 자바 파일들을 아래의 그림처럼 생성해주자 

이렇게 만들어주고 내가 만들어줄 플래그먼트를 xml에 작성해준다 

 

xml

<?xml version="1.0" encoding="utf-8"?>

<!--1. 먼저 이거 만들어줌  -->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <!--주제를 나눠주는 카테고리 -->
    <PreferenceCategory
        android:title="메시지알림">

        <SwitchPreference
            android:key="messag"
            android:title="메시지 알림"/>
        <!--이것이 눌렸을때 안속 버튼이 나온다 /  새로운 화면을 만들어주는것  -->
        <PreferenceScreen
            android:key="Keyword_screen"
            android:title="키워드 알림"
            android:summary="사용안함">
        <!--안속 스위치-->
            <SwitchPreference
                android:defaultValue="false"
                android:key="keyword"
                android:title="키워드 알림"
                android:summary="등록된 키워드가 포함된 메시지는 채팅방 알림이 꺼져있어도 푸시 알림을 받게 되어 키워드는 강조되어 보입니다."
                />
        </PreferenceScreen>
    </PreferenceCategory>



    <PreferenceCategory android:title="소리알림">
       <SwitchPreference
           android:title="소리"
           android:key="sound"/>
        <!-- 스트링xml에 리스트를 만들었고 가져다 쓴다 -->
        <ListPreference
            android:entries="@array/arrya_voice"
            android:entryValues="@array/arrya_voice"
            android:key="sound_list"
            android:summary="카톡"
            android:title="알림음"
            android:dependency="sound"/>
<!--dependency 저게 있어서 위쪽 스위치랑 연동시킴  -->
    </PreferenceCategory>



    <PreferenceCategory android:title="기타알림">
        <EditTextPreference
            android:title="닉네임 설정"
            android:key="nickname"
            android:summary="닉네임을 설정해주세요"
            android:dialogTitle="닉네임 설정"/>
        <PreferenceScreen
            android:title="Another Activity 설정"
            android:summary="그외 액티비티 설정">
            <!--인텐트로 AnotherActivity로 이동  다른액티비티랑 연동하여 사용하기 위함이다 -->
            <intent android:targetPackage="com.example.preferencefragment_ex"
                android:targetClass="com.example.preferencefragment_ex.AnotherActivity"/>
        </PreferenceScreen>



    </PreferenceCategory>


</PreferenceScreen>

완성본 프래그먼트

여기서 중요한부분은 ListPreference 에는 리스트가 들어가야하기 때문에 arrays.xml을 만들고 다음과 같이 작성해준다  

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="arrya_voice">
        <item>카톡</item>
        <item>카톡왔죵</item>
        <item>깨록</item>
        <item>카카오토크</item>
    </string-array>
</resources>

목록 

 

이렇게 해주면 이제 코드 작성을 해주면 되는데 위의 완성본 사진을 보면 

위에서부터 1.  메시지알림에대한 스위치버튼이 있고 키워드 2. 알림을 누르면 해당 다른 프래그먼트 화면을 띄우며 스위치버튼이 나오게 할것이고 , 3.소리알림의 스위치버튼과 4.알림음을 누르면 바로위 사진처럼 원하는 소리리스트가 나올것이다. 이 리스트에서 원하는것을 누르면 알림음의 summary도 함께 해당문자로 변경해줄것이다. 

그리고 5.닉네임 설정을 누르면 에디트 택스트가 나오면서 에디트 택스트에 적은 글자를 summary로 표시해줄것이고 

마지막6. AnotherActivity설정을 누르면 다른 액티비티로 화면 전환 하는것을 해볼것이다 .

 

이제 코드를 보면서 이해를 해보도록하자

(참고 어나더 액티비티는 단순한 이동이 가능한지를 확인하기 위하여 만들어 놓은 액티비티라 그냥 만들기만함 ) 

 

일단 만들어 놓은 xml을 사용할 자바 코드를 먼저 보자 

SettingPreferenceFragment클래스

// xml파일을 가져오기위한 자바 클래스
//2.  PreferenceFragmentCompat 상속받아야한다 그리고 이건 외부라이브러리라 추가해서 사용해야한다
public class SettingPreferenceFragment extends PreferenceFragmentCompat {

    Preference soundPreference; //사운드 프리퍼런스 참조변수
    Preference keywordScreen;   //키워드 프리퍼런스 참조변수
    Preference editPreference;  //에디트택스트트 리퍼런스 참조변수

    //자동저장된것을 가져다 사용할려면 이뇨석이 필요함 액티비티생명주기 할때 데이터저장하기 위해 사용해봄
    SharedPreferences prfs;


    @Override // 3. 임플리먼트 메소드이다
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        //메인에 셋컨텐트뷰와 같은 코드이다.
        //xml에 있는 것을 가져와 사용하겠다
        setPreferencesFromResource(R.xml.settings_preference, rootKey);


        if(rootKey == null) {
            //메인에서 파인드 뷰바이 아이디랑 똑같은 상황임
            soundPreference = findPreference("sound_list");
            keywordScreen = findPreference("Keyword_screen");
            editPreference = findPreference("nickname");


            //선택한 항목이 프리퍼런스에 자동으로 저장된다
            //저장해놓은것들을 가져올려면 프리퍼런스 매니저를 통해 prfs에 참조해줌
            prfs = PreferenceManager.getDefaultSharedPreferences(getActivity());


            // 그 저장된 값을 가져오고 그 값으로 변경해주기 위한 코드
            //키값으로 저장이 되어있다 , 사용할때도 키값으로 사용해준다
            if (!prfs.getString("sound_list", "").equals("")) {
                soundPreference.setSummary(prfs.getString("sound_list", "카톡"));
            }

            // 뒷부분(defValue) 키를 가져올려고 했는데 키값이 없다면 저렇게 해줘라
            if (prfs.getBoolean("Keyword", false)) {
                keywordScreen.setSummary("사용");
            } else {
                keywordScreen.setSummary("사용안함");
            }

            if (!prfs.getString("nickname", "").equals("")) {
                editPreference.setSummary(prfs.getString("nickname", "닉네임을 설정해주세요"));

            }
            prfs.registerOnSharedPreferenceChangeListener(prefListener);
        }
    }
    // (위부분) 여기까지가 껏다 켯을때 다시 저장해주는것이고
    // 아래부분은 만약 저장값이 변경되면 실행하는 메소드이다
    // 고로 사용자가 해당버튼을 눌럿을시 저장값이 변경됨과 동시에 해당 화면도 변경하기 위한 코드이다.
       SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
           @Override
           public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
               if(key.equals("sound_list")){
                   soundPreference.setSummary(prfs.getString("sound_list","카톡"));
               }
               if (prfs.getBoolean("keyword",false)){
                   keywordScreen.setSummary("사용");
               }else {
                   keywordScreen.setSummary("사용안함");
               }

               if(key.equals("nickname")){
                   editPreference.setSummary(prfs.getString("nickname","닉네임을 설정해주세요"));
               }
           }

       };
    //다른 프래그먼트화면을 띄울때 프래그먼트 화면은 스스로 화면 전환이 안되기 때문에
    @Override //메인액티비티한테 해달라고 보내는것이다 . (콜백함수) 인텐트로 보내서 메인에서 작업처리
    public void onNavigateToScreen(PreferenceScreen preferenceScreen) {
        Intent intent = new Intent(getActivity(),MainActivity.class);
        intent.putExtra("target",preferenceScreen.getKey());
        startActivity(intent);
    }
}


일단 이것을 사용하려면 해당 build.gradle 에 들어가서 외부라이브러리 추가해야한다 

이렇게 추가해주고나서 PreferenceFragmentCompat이것 상속해주고 오버라이드 메소드하고 사용하면됨 

 

이제 메인을 볼것인데 메인에 레이아웃은 프래그먼트로 가득 채울것이기 때문에 다른설정없이 프래그먼트만 설정해주면 된다 

메인레이아웃

<?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/setting_fragment"
        android:name="com.example.preferencefragment_ex.SettingPreferenceFragment"/>

메인액티비티

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       //1 프래그먼트 객체화
       SettingPreferenceFragment settingPreferenceFragment = new SettingPreferenceFragment();
       //2 인텐트로 받으거 까주고
       Intent intent = getIntent();
        if(intent!=null){
            //3 키값 받아오고
            String rootkey = intent.getStringExtra("target");
            if(rootkey!=null){

                //3 번들을 만들어서 주소값 참조 시킨뒤
                Bundle bundle = new Bundle();
                bundle.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT,rootkey);
                //3번들로 프래그먼트 던져주기
                settingPreferenceFragment.setArguments(bundle);
            }
        }
    //프래그먼트 시작 
    getSupportFragmentManager().beginTransaction().replace(android.R.id.content,settingPreferenceFragment,null).commit();
   }
}

 

다른것들은 SettingPreferenceFragment클래스 내에서 작동이 되지만 PreferenceScreen(새로운 프래그먼트화면을 만들기) 는 스스로 작동이 불가능하기때문에 메인에 요청하여 화면을 다른프래그먼트로 변경해주었다. 

1. PreferenceScreen key 값을 해당해주고 ( Keyword_screen)

2. SettingPreferenceFragment에서 onNavigateToScreen(콜백메소드)를 통해 메인으로 키값던져주고

3. onNavigateToScreen메소드를 통해 넘겨받은 키값으로 프래그먼트를 실행 해주었다 .

 

마지막 버튼 다른 액티비티 전환하는 부분은

여기처럼 먼저 인텐트로 해당 주소값을 적어주면 버튼이 눌렸을때 인텐트를 통하여

해당 패키지에 해당 클래스로 찾아 가게 된다 .

 

작동화면이 여러개라 첨부는 못하지만 위쪽에 완성본을 보면 된다 ! 중요한것들도 있고 불필요한것들도 있지만 

해당기능을 잘 알아둔다면 나중에 유용하게 사용할거 같다~ 

 

반응형