Building Preference Screen in SUSI Android
SUSI provides various preferences to the user in the settings to customize the app. This allows the user to configure the application according to his own choice. There are different preferences available such as to select the theme or the language for text to speech. Preference Setting Activity is an important part of an Android application. Here we will see how we can implement it in an Android app taking SUSI Android (https://github.com/fossasia/susi_android) as the example.
Firstly, we will proceed by adding the Gradle Dependency for the Setting Preferences
compile 'com.takisoft.fix:preference-v7:25.4.0.3'
Then to create the custom style for our setting preference screen we can set
@style/PreferenceFixTheme
as the base theme and can apply various other modifications and color over this. By default it has the usual Day and Night theme with NoActionBar extension.
Now to make different preferences we can use different classes as shown below:
SwitchPreferenceCompat: This gives us the Switch Preference which we can use to toggle between two different modes in the setting.
EditTextPreference: This preference allows the user to give its own choice of number or string in the settings which can be used for different actions.
For more details on this you can refer the this link.
Implementation in SUSI Android
In SUSI Android we have created an activity named activity_settings which holds the Preference Fragment for the setting.
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/chat_pref" android:name="org.fossasia.susi.ai.activities.SettingsActivity$ChatSettingsFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.fossasia.susi.ai.activities.SettingsActivity"/>
The Preference Settings Fragment contains different Preference categories that are implemented to allow the user to have different customization option while using the app. The pref_settings.xml is as follows
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:title="@string/settings_title"> <PreferenceCategory android:title="@string/server_settings_title"> <PreferenceScreen android:title="@string/server_pref" android:key="Server_Select" android:summary="@string/server_select_summary"> </PreferenceScreen> </PreferenceCategory> <PreferenceCategory android:title="@string/settings_title"> <com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat android:id="@+id/enter_key_pref" android:defaultValue="true" android:key="@string/settings_enterPreference_key" android:summary="@string/settings_enterPreference_summary" android:title="@string/settings_enterPreference_label" /> </PreferenceCategory>
All the logic related to Preferences and their action is written in SettingsActivity Java class. It listens for any change in the preference options and take actions accordingly in the following way.
public class SettingsActivity extends AppCompatActivity { private static final String TAG = "SettingsActivity"; private static SharedPreferences prefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); prefs = getSharedPreferences(Constant.THEME, MODE_PRIVATE); Log.d(TAG, "onCreate: " + (prefs.getString(Constant.THEME, DARK))); if(prefs.getString(Constant.THEME, "Light").equals("Dark")) { setTheme(R.style.PreferencesThemeDark); } else { setTheme(R.style.PreferencesThemeLight); } setContentView(R.layout.activity_settings); }
The class contains a ChatSettingFragment which extends the PreferenceFragmentCompat to give access to override functions such as onPreferenceClick. The code below shows the implementation of it.
public boolean onPreferenceClick(Preference preference) { Intent intent = new Intent(); intent.setComponent( new ComponentName("com.android.settings","com.android.settings.Settings$TextToSpeechSettingsActivity" )); startActivity(intent); return true; } }); rate=(Preference)getPreferenceManager().findPreference(Constant.RATE); rate.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + getContext().getPackageName()))); return true; } }); }
For diving more into the code we can refer to the github repo of Susi Android (https://github.com/fossasia/susi_android).
Resources
- Article by Jakob Ulbrich on building setting screen in Android: https://medium.com/@JakobUlbrich/building-a-settings-screen-for-android-part-1-5959aa49337c
- Github repository of Android Support Preference Fix by Gericop https://github.com/Gericop/Android-Support-Preference-V7-Fix