[Android] 액션바에 Preferences 앱 설정화면 만들기
Preferences 앱 설정화면
with PreferenceFragmentCompat
PreferenceActivity를 사용하려고 했는데 API 29부터는 deprecated 되기 때문에 대안으로
PreferenceFragmentCompat을 이용해서 사용할 수 있습니다.
PreferenceFragmentCompat은 Activity가 아니라서 AndroidManifest에 등록이 되지 않습니다.
해결방법은 AppCompatActivity를 상속한 레이아웃을 만들어서 android:name으로 클래스를 선언해주시면 됩니다.
∨ gradle 추가
∨ Toolbar 생성 및 설정
∨ menu 생성
∨ onCreateOptionsMenu, onOptionItemSelected 메서드 오버라이드
∨ res/xml/user_preference.xml 파일생성 & PreferenceFragmentCompat 상속받은 UserPreferences 클래스 생성
∨ res/layout/preferences.xml 파일생성 & AppCompatActivity 상속받은 PreferencesActivity 클래스 생성
∨ manifest.xml에 해당 Activity 추가
∨
implementation 'androidx.preference:preference:1.1.0'
gradle에 preference 추가.
∨
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
// 툴바 설정
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
xml에 Toolbar 추가하고 java파일에 설정.
∨
res 우클릭 - New - Android Resource Directory에서 menu 폴더를 생성해줍니다.
생성한 menu폴더 우클릭 - New - Menu Resource File로 원하는 이름으로 메뉴 xml 파일을 생성해주세요.
∨
menu_main.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_settings"
android:title="settings"
android:icon="@drawable/ic_baseline_settings_24"
app:showAsAction="always"/>
</menu>
생성한 menu파일에 추가하려는 버튼을 item으로 추가시킵니다.
app:showAsAction은 액션바에 바로 보이게하거나 버튼을 눌렀을 때 보이게하도록 설정할 수 있습니다.
∨
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.action_settings:
startActivity(new Intent(this, PreferencesActivity.class));
break;
}
return super.onOptionsItemSelected(item);
}
onCreateOptionMenu와 onOPtionsItemSelected를 오버라이드 해줍니다.
onCreateOptionMenu로 액션바에 메뉴를 추가하고,
onOptionsItemSelected로 해당 버튼을 클릭했을 때 수행할 코드를 작성시켜줍니다.
버튼이 하나일 경우에는 if로 간단하게 하셔도 됩니다. 여러개일 경우에는 위와 같이 switch case로 하시면 됩니다.
∨
UserPreferences.java
public class UserPreferences extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.user_preferences, rootKey);
}
}
PreferenceFragmentCompat을 상속한 클래스를 생성합니다.
user_preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
app:key="notifications_category"
app:title="Notifications">
<SwitchPreferenceCompat
app:key="notifications"
app:title="알림"/>
<CheckBoxPreference
app:title="체크박스"/>
</PreferenceCategory>
<PreferenceCategory
app:key="help_category"
app:title="Help">
<Preference
app:key="feedback"
app:summary="Report technical issues or suggest new features"
app:title="Send feedback"/>
</PreferenceCategory>
</PreferenceScreen>
res 우클릭 - New - Android Resource Directory로 xml 폴더 생성.
xml 폴더 우클릭해서 root element를 PreferenceScreen로 해서 xml파일을 생성.
스위치, 체크박스 등 설정이 가능하고, 카테고리로 지정해서 묶을수도 있습니다.
∨
PreferencesActivity.java
public class PreferencesActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.preferences);
}
}
AppCompatActivity를 상속한 클래스를 생성합니다.
preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/settings_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="클래스명"/>
</FrameLayout>
res/layout에 xml파일을 생성합니다.
FrameLayout에 fragment를 만들고 android:name에 PreferenceFragmentCompat을 상속받은 클래스명을 입력해주시면 됩니다.
(settings_container로 id 설정 안해주시면 에러 발생합니다.)
∨
<activity android:name=".PreferencesActivity"/>
manifest에 activity를 추가해줍니다. AppCompatActivity가 상속된!
preferences 파일이 여러개여서 혼동이 올 수 있으니 유의하세요.
'안드로이드 > Android' 카테고리의 다른 글
[Android] SQLite DB 백업 및 복구 (0) | 2020.10.18 |
---|---|
[Android] Date to String & String to Date (0) | 2020.09.17 |
[Android] Intent로 화면 이동 및 데이터 전달 (0) | 2020.09.03 |
[Android] 테두리 설정하기 (0) | 2020.09.01 |
[Android] 키보드에 UI가 가려질 경우 adjustResize (0) | 2020.08.29 |