Customize the Styles and Themes
- How to customize the look and feel for the UI screens of Flows component
Prerequisites
- You have Set Up a BTP Account for Tutorials. Follow the instructions to get an account, and then to set up entitlements and service instances for the following BTP services.
- SAP Mobile Services
- You completed Get Familiar with the Flows Component by a Wizard Generated Application.
An enterprise mobile application usually has its own branding theme, and therefore requires the onboarding screens inside the Flows components to have the same look and feel as the other business screens in the app. SAP BTP SDK for Android version 3.4 provides the enhancement for customizing themes and styles for onboarding UI screens. With this enhancement, it’s easier for client code to do following customizations:
- Define the logo image, as well as its height and width.
- Customize the styles for text input fields.
- Customize the text styles.
- Customize the button styles.
- Customize the theme colors.
- Step 1
-
Open the project you previously created using the SAP BTP SDK Wizard for Android.
-
Press
Shift
twice and typestyles.xml
to open thestyles.xml
file. The default themes and styles for the wizard-generated app are defined in this file. -
Press
Shift
twice and typecolors.xml
to open thecolors.xml
file. The default colors for the wizard-generated app are defined in this file.
Log in to complete tutorial -
- Step 2
- Define your logo. To change the logo image at the top of each onboarding screen , define the following style in the
styles.xml
file.XMLCopy<style name="OnboardingLogo"> <!-- The value is always @drawable/<your_logo_name_without_ext> --> <!-- Do not add the file extension e.g. .png --> <item name="android:src">@drawable/custom_logo</item> <item name="android:layout_height">72dp</item> <item name="android:layout_width">72dp</item> </style>
- Define styles for flat and raised button. Both raised and flat button styles can be customized by specifying
onboarding_button_flat_ref
andonboarding_button_raised_ref
. And the client code can also define the button background color and text color for different states.XMLCopy<!-- onboarding flat button --> <item name="onboarding_button_flat_ref">@style/Widget.Onboarding.Button.Borderless</item> <item name="onboarding_button_flat_text">@color/sap_ui_flat_button_text_color</item> <item name="onboarding_button_flat_text_disabled"> @color/onboarding_button_flat_text_disabled </item> <item name="onboarding_button_flat_background"> @color/onboarding_button_flat_background </item> <!-- onboarding raised button --> <item name="onboarding_button_raised_ref">@style/Widget.Onboarding.Button.Borderless</item> <item name="onboarding_button_raised_background_pressed">@color/onboarding_button_raised_background_pressed</item> <item name="onboarding_button_raised_background_disabled">@color/onboarding_button_raised_background_disabled</item> <item name="onboarding_button_raised_background">@color/onboarding_button_raised_background</item>
-
Define styles for text input fields. The onboarding screens use the Fiori UI component
SimplePropertyFormCell
for the text input fields. Client code can customize the style and text color for the component.XMLCopy<!-- SimplePropertyFormCell --> <item name="onboarding_simple_property_focused_ref"> @style/Onboarding.SimplePropertyFormCell.Focused </item> <item name="onboarding_simple_property_focused_text_color">@color/onboarding_formcell_text</item> <item name="onboarding_simple_property_unfocused_ref"> @style/Onboarding.SimplePropertyFormCell.Unfocused </item> <item name="onboarding_simple_property_unfocused_text_color">@color/onboarding_base_text</item>
Besides the above theme attributes, client code can customize the active border for
SimplePropertyFormCell
in thecolors.xml
file.XMLCopy<!-- SimplePropertyFormCell active value border --> <color name="sap_ui_field_active_border_color">@color/onboarding_active_border</color>
-
Define the theme. Put all the customized styles in a theme extended from the parent theme
FioriTheme.Onboarding
, so the client code can only provide the customized styles and simply use the default style inFioriTheme.Onboarding
for the others.XMLCopy<!-- styles.xml --> <style name="AppTheme" parent="FioriTheme.Onboarding"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!-- Sign In screen avatar background --> <item name="onboarding_avatar_background">@color/colorPrimary</item> <!-- If commented out, the default value in the 'onboarding' theme will be used. <item name="onboarding_avatar_text_color">@color/onboarding_avatar_text_color</item> --> <!-- onboarding raised button --> <item name="onboarding_button_raised_background_pressed">@color/colorPrimary</item> <item name="onboarding_button_raised_background_disabled">@color/colorPrimaryDark</item> <item name="onboarding_button_raised_background">@color/colorPrimary</item> <!-- onboarding flat button --> <item name="onboarding_button_flat_text">@color/colorAccent</item> <item name="onboarding_button_flat_text_disabled">@color/colorPrimaryDark</item> <item name="onboarding_button_flat_background">@color/onboarding_default_background</item> <!-- SimplePropertyFormCell --> <item name="onboarding_simple_property_focused_text_color">@color/colorAccent</item> <item name="onboarding_simple_property_unfocused_text_color">@color/colorPrimaryDark</item> </style> <style name="OnboardingLogo"> <!-- The value is always @drawable/<your_logo_name_without_ext> --> <!-- Do not add the file extension e.g. .png --> <item name="android:src">@drawable/custom_logo</item> <item name="android:layout_height">72dp</item> <item name="android:layout_width">72dp</item> </style>
Define the colors in
colors.xml
file.XMLCopy<!-- colors.xml --> <!-- Primary colors --> <color name="colorPrimary">@color/colorPrimaryRed</color> <color name="colorPrimaryDark">@color/colorPrimaryDarkRed</color> <color name="colorAccent">@color/colorAccentRed</color> <!-- Red Theme --> <color name="colorPrimaryRed">#d12920</color> <color name="colorPrimaryDarkRed">#631216</color> <color name="colorAccentRed">#ab1d22</color> <!-- SimplePropertyFormCell active value border --> <color name="sap_ui_field_active_border_color">@color/colorPrimaryDark</color>
Log in to complete tutorial - Define your logo. To change the logo image at the top of each onboarding screen , define the following style in the
- Step 3
-
To notify the customized theme to the Flows component, create a
FlowOptions
instance that overrides thegetApplicationTheme
function to return the theme ID and set thisFlowOptions
instance for theFlowContext
instance to start the flow.JavaCopyFlowContext flowContext = new FlowContextBuilder() .setApplication(appConfig) .setFlowOptions(new FlowOptions(){ @Override public boolean getApplicationTheme() { return R.style.AppTheme; } }).build(); Flow.Companion.start(context, flowContext, (code, result, data) -> { if(result == RESULT_OK) { startMainBusinessActivity(); } return null; });
-
After applying the customized theme and style, the look and feel of the wizard-generated app are changed accordingly.
Log in to complete tutorial -
- Step 4
Client code may use its own screens in onboarding process or implement customized flows instead of predefined flows, and want to apply themes to the activities or the fragments.
-
To customize an activity, client code must define the theme in the AndroidManifest.xml file.
XMLCopy<!-- AndroidManifest.xml --> <activity android:name=".WelcomeActivity" android:theme="@style/AppTheme.NoActionBar"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- styles.xml --> <style name="AppTheme.NoActionBar" parent="AppTheme"> ... </style>
-
To customize a fragment, such as a
FlowStepFragment
for a customized flow, use the following code in theonCreateView
method of the fragment.JavaCopypublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { ContextThemeWrapper themeWrapper = new ContextThemeWrapper(getActivity(), R.style.AppTheme); CustomStepFragmentBinding binding = CustomStepFragmentBinding.inflate(inflater.cloneInContext(themeWrapper), container, false); return binding.getRoot(); }
Please see Flows Theme and Style for more information on UI customization.
Congratulations! You now have learned how to customize the styles and themes for the UI screens of Flows component!
-