PreferenceScreen, Preference를 이용한 설정화면 만들기

출처:
Udacity
사용자 인터페이스-설정(API가이드)







일단, 메뉴에서 쓰일 문자열을 string.xml에 정의해준다.
<!-- Settings Menu Item [CHAR LIMIT=NONE] -->
<string name="settings_menu_item">세팅</string>
<!-- Settings Activity Title [CHAR LIMIT=NONE] -->
<string name="settings_title">지진 규모 세팅</string>




다음으로 세팅을 주관할 SettingActivity클래스를 만들어준다. 내부클래스로 PreferenceFragment를 상속받은 커스텀 프래그먼트도 역시 구현해주도록 한다. 이 프래그먼트 안에 설정창이 들어가게된다.

SettingActivity.java
package com.example.android.quakereport;

import android.os.Bundle;
import android.preference.PreferenceFragment;
import android.support.v7.app.AppCompatActivity;

public class SettingsActivity extends AppCompatActivity {

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

    public static class EarthquakePreferenceFragment extends PreferenceFragment {

    }
}




위의 액티비티에 쓰이고있는 setting_activity.xml파일을 만들어준다.
<fragment
    android:name="com.example.android.quakereport.SettingsActivity$EarthquakePreferenceFragment"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.android.quakereport.SettingsActivity">
</fragment>
주의할점은, android:name에 적절한 값을 넣어줘야한다는것이다. 이 속성은 레이아웃 안에서 인스턴스화 할 Fragment클래스를 지정해준다.




액티비티를 추가해줬기 때문에 메니패스트 파일에 액티비티를 물론 추가해줘야한다.
<activity
    android:name=".SettingsActivity"
    android:label="@string/settings_title">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.android.quakereport.EarthquakeActivity"/>
</activity>



res/menu에 main.xml을 만들어준다. (메뉴에 대해 알아보려면 링크를 참조하자.)

main.xml
     <menu 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"
         tools:context="com.example.android.quakereport.EarthquakeActivity">
         <item
             android:id="@+id/action_settings"
             android:title="@string/settings_menu_item" 
             android:icon="@drawable/ic_filter"
             android:orderInCategory="1"
             app:showAsAction="ifRoom" />
     </menu>
설정을 나타내는 ic_filter아이콘파일을 해상도별로 얻고싶다면 링크를 참조하도록 하자.




설정 액티비티의 부모액티비티에 메뉴를 띄워주기위해 두개의 메서드를 오버라이드 한다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        Intent settingsIntent = new Intent(this, SettingsActivity.class);
        startActivity(settingsIntent);
        return true;
    }
    return super.onOptionsItemSelected(item);
}
여기까지 따라했으면, 앱바에 설정액티비티와 연결되는 아이콘이 뜬 것을 확인할 수 있을것이다.(설정 액티비티는 아직 비어있는 상태이다)



이제 설정액티비티 내용을 채워보도록 하자. 일단 필요한 문자열을 추가해주자.
  <!-- Strings For Minimum Magnitude Preference [CHAR LIMIT=30] -->
<string name="settings_min_magnitude_label">최소 지진 규모</string>
<string name="settings_min_magnitude_key" translatable="false">min_magnitude</string>
<string name="settings_min_magnitude_default" translatable="false">6</string>




이제 구체적인 프레퍼런스 스크린을 정의해주도록 하자. res폴더 아래 xml리소스폴더를 만들어준다. 다음, setting_main.xml파일을 만들어준다. 파일을 만들어주면 PreferenceScreen이 루트뷰로 자동 작성되있는것을 볼 수 있을것이다. PreferenceScreen내에 여러타입의 Preference뷰를 만들 수 있는데, 여기선 간단하게 EditTextPreference뷰를 구현해보도록 하자.

setting_main.xml
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:title="@string/settings_title">

    <EditTextPreference
        android:defaultValue="@string/settings_min_magnitude_default"
        android:inputType="numberDecimal"
        android:key="@string/settings_min_magnitude_key"
        android:selectAllOnFocus="true"
        android:title="@string/settings_min_magnitude_label" />

</PreferenceScreen>




SettingActivity의 내부클래스로 지정해준 커스텀설정프래그먼트에 onCreate메서드를 오버라이드하고, 위에서 작성한 setting_activity.xml파일을 addPreferenceFromResource()로 연결시켜준다.

SettingActivity.java
package com.example.android.quakereport;

 import android.os.Bundle;
 import android.preference.PreferenceFragment;
 import android.support.v7.app.AppCompatActivity;

 public class SettingsActivity extends AppCompatActivity {

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

     public static class EarthquakePreferenceFragment extends PreferenceFragment {

         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             addPreferencesFromResource(R.xml.settings_main);
         }
     }
 }





































댓글

이 블로그의 인기 게시물

API 요청 URL(URI) 만들기(조합하기) -Uri.Builder사용하기-

TextView에 글자를 넣어주는 방법(setText, append)

텍스트 뷰의 배경을 원형 이미지로 지정하고, 배경 색상 채우기(안드로이드)