Mobile forms for Android Apps

Mobile form for Android device

Mobile form for Android device

I think there might be better and easier ways to implement these kind of mobile forms for an Android App because mine seems to me relative complicated and error-prone. Despite I want to share with you my implementation experiences, maybe my readers can leave me better solutions in the comments section and I can grow and learn.

First of all I start with the Layout implementation. LinearLayouts and GridLayouts I did already use for the Layout of the start screen in the Fitness Manager App. The GridLayout contains the raw design definitions for the mobile form. The fine tuning of the design is handled again by LinearLayouts using the layout attributes layout_sum and layout_weight. Additionally to the XML Layout definition the items of the View must be adapted to the display size of the Android device programmatically in the activity. Similar to the implementation of the start screen I added runnables to the layout queue. In these runnables I could request the width and height of single view elements, the DisplayMetrics of the Android device and set the LayoutParams of every view element. In the code snippet below the underlying ScrollView is resized within the runnable. The displayed example for view adaption was also useful for layout adaptions within onConfigurationChange and onResume. Still I’m not sure if this is the best and correct way to adapt views and layouts to different Android devices.

ScrollView Runnable definition

ScrollView Runnable definition

Additionally to the layout requirements I had different requirements concerning the behaviour of the single view elements.

  1. The inputTypes of the EditTexts must be set. This is handled in the XML layout definition of the view elements. There are several options for inputTypes like TextCapSentences, TextAutoCorrect, TextMultiLine or number. The inputType of the EditText does influence the input of the EditText as well as the behaviour and display of the virtual keyboard.

    XML Layout definition for EditText

    XML Layout definition for EditText

  2. The Save-Button should be only enabled and clickable if the user entered a name in the corresponding EditText. Furthermore the design of the button should be different in this two states. In the XML Layout definition I did set the corresponding attribute of the ImageButton android:clickable to false but this was not sufficient.

    ImageButton

    ImageButton

    I also had to disable the Save-Button programmatically in the onCreate function of the activity.

    ImageButton settings in onCreate function

    ImageButton settings in onCreate function

    Furthermore I had to implement an addTextChangedListener that toggeled the ImageButton depending on the input of the EditText for the name. The implementation of the addTextChangedListener is not necessary but the other option is to check the value of the EditText in every ActionListener of every single view element in order to prevent the user to save an object with an empty name.

    EditText addTextChangeListenener

    EditText addTextChangeListenener

  1. If EditTexts are used in a mobile form, it is often necessary to check the value of the EditText when the user finished the input. This is handled by implementing a setOnEditorActionListener. Therefore the XML Layout definition of the EditText must contain the attribute android:ImeOptions with it’s value set to actionDone. The important issue concerning ActionListeners for EditTexts is the handling of the virtual keyboard. The virtual keyboard must be closed programmatically within the ActionListeners. This is realized by using the InputMethodManager.

    EditText setOnEditorActionListener

    EditText setOnEditorActionListener

  1. Often the input of EditTexts is limited by constraints. In order to indicate the constraints of an EditText politely to the user, AlertDialogs can be used. AlertDialogs can contain one or more Buttons with different possible options for the behaviour of the activty.

    AlertDialog

    AlertDialog

If you have any questions, any improvement suggestions for the implementation (I mentioned that this is my first Android App) or any improvement suggestions for my English, I really would appreciate if you can leave me a comment.

And I would even more appreciate if you like to check out the ‘Fitness Manager’ App in the Google Play Store or the ‘Fitness Manager’ App in the iTunes Store. See you.

Follow us on

Facebook
Twitter
Google Plus

Layouts for Android Apps

Fitness Manager start screen

Fitness Manager start screen

Unfortunately our awesome, great, incredible, wonderful and joyful travel year is over now. So we have to work and earn money to hopefully continue this experience soon. So I started to program and develop my first Android App. I want to write about the difficulties I ran into while developing my apps. Therefore I have to switch the language of my blog to English and the blog is obviously getting technical. I want to apologize for both. Ok, let’s start and have a look to Layouts for Android Apps.

My first App is called ‘Fitness Manager’ and the app is available for all kind of Apple IOS Devices and for many many different Android Devices. The App provides the user with useful features and functions around planning workout sessions in the gym. The start screen of the app leads the user to different main functionalities like ‘Create a workout schedule’ or ‘View statistics’ and to further sub tasks like ‘Upload data to the cloud’. In order to get this looking good in my eyes on every device I had to take a lot of issues into account.

You can embed LinearLayouts in GridLayouts or you can use TableLayouts surrounded by FrameLayouts. You have depending on the choosen layout several different layout options which you can set. The posibilities concerning the layouts are incredible. But you only have three possible values in the layout.xml to set the layout_width and the layout_height of every view item: match_parent, wrap_content or a fixed value. I wanted to insert a logo, an advertise view element, four big ImageButtons for the main functionalities and 4 small ImageButtons for the sub tasks into the start screen like displayed in the above image. And that’s how layout.xml for the start screen looks like:

  1. All view elements are embedded in a GridLayout with only one column but 5 rows.

    GridLayout of Fitness Manager start screen

    GridLayout of Fitness Manager start screen

  1. The logo is inserted in the first row of the GridLayout and the advertise view (not displayed in the image above) in the second row. In order to center the logo and the advertise view in every device the layout_gravity of every view element has to be set to center.

  1. Logo embedded in LinearLayout

    Logo embedded in LinearLayout

    In the next rows of the GridLayout I did insert the ImageButtons for the main functionalities and the sub tasks. For every row I added one LinearLayout which spreads over the complete width of the screen and then I inserted two to four LinearLayouts which contain the ImageButtons. In order to get the design flexible I did work with the settings layout_sum and layout_weight. The layout_sum is set in the outer LinearLayout. The layout_weight is defined in the inner LinearLayouts. The sum of the layout_weights is defined in the layout_sum. Again I had to center every view element. The orientation of the outer LinearLayout is defined horizontal whereas the orientation of the inner LinearLayout is set to vertical.

    ImageButton embedded in LinearLayouts

    ImageButton embedded in LinearLayouts

    I want to point out the meaning of the LinearLayout orientation here because in the beginning my design looked like displayed below also I had centered every single element. The failure was the orientation of the inner LinearLayouts which was defined horizontal. Maybe this implementation issue is obvious for many many other Android developers but I’m a blonde developer and so I write this for all the blond programmers out there. It almost drove me nuts and I couldn’t find a hint in the internet why my design looked so shitty until I had a close look to the orientation of the LinearLayouts.

    Shitty start screen of Fitness Mangager App displayed in Android Studio Tablet emulator

    Shitty start screen of Fitness Mangager App displayed in Android Studio Tablet emulator

  1. At least I had to adapt the layout progammatically in the corresponding Java File because in the designer of the Android Studio the view was displayed like shown below and moreover the sizes of the ImageButtons needed to be fitted to the different screen sizes of available Android devices:

    Fitness Manager start screen displayed in Android Studio Designer

    Fitness Manager start screen displayed in Android Studio Designer

    If you want to change the sizes of different view elements dependent on the size of other view elements, you cannot implement the changes in the onCreate or onResume funtions of an activity. The drawing phase of the view, which provides the measurements of the single view elements is only finished at the end of onResume function. Therefore I added runnables to the layout queue which will be invoked after the call of setContentView when all view measurements are finished. In these runnables I could request the width and height of single view elements, the DisplayMetrics of the Android device and set the LayoutParams of the ImageButtons.

    ImageButton Runnable

    ImageButton Runnable

If you have any questions concerning my layout design and implementation, any improvement suggestions for the implementation (I mentioned that this is my first Android App) or any improvement suggestions for my English, I really would appreciate if you can leave me a comment.

And I would even more appreciate if you like to check out the ‘Fitness Manager’ App in the Google Play Store or the ‘Fitness Manager’ App in the iTunes Store. See you.

Follow us on
Facebook
Twitter
Google Plus