Android Question Tabstrip + Scrollview + Keyboard = Height?

Discussion in 'Android Questions' started by JohnC, Dec 14, 2017.

  1. JohnC

    JohnC Well-Known Member Licensed User

    I am using a Tabstrip and a few of the tab's pages have edittext controls on them.

    So, I am forced to use a scrollview on each tabstrip page that has a edittext on it to make sure they can be visible when the keyboard is shown.

    So, then I am forced to use IME to detect when the keyboard switches show/hide states so I can adjust the viewport size of the scrollview.

    But I am having a hard time figuring out how to set the sv.height to the proper height of the visible part of the current tab page.

    I would like the tab titles to remain visible, so I need to figure out the height of the visible space between the bottom of the tab titles row and the top of the keyboard.

    Any ideas?
  2. Erel

    Erel Administrator Staff Member Licensed User

    See the attached example.

    The important code is:
    Sub EditText_FocusChanged (HasFocus As Boolean)
    If HasFocus Then
           FocusedField = 
    Dim FocusedField As EditText 'it will be uninitialized
       End If
    End Sub

    Private Sub ime_HeightChanged (NewHeight As Int, OldHeight As Int)
    If NewHeight < OldHeight Then
           KeyboardSize = OldHeight - NewHeight
           KeyboardSize = 
    End If
    End Sub

    Private Sub UpdateLayoutIfNeeded
    If FocusedField.IsInitialized = False Then Return
    Dim LowestVisiblePointRelativeToSV As Int = 100%y - KeyboardSize - 50dip '50dip = tab height
       If FocusedField.IsInitialized Then
    Dim fieldBottom As Int = FocusedField.Top + FocusedField.Height + 2dip
    Dim p As Panel = FocusedField.Parent
    Dim sv As ScrollView = p.Parent
           sv.ScrollPosition = fieldBottom - LowestVisiblePointRelativeToSV
    End If
    End Sub
    Note that the event name of all EditTexts is EditText.

    Attached Files:

  3. JohnC

    JohnC Well-Known Member Licensed User


    It seems like the OS will automatically scroll the sv to make sure the focused edittext is visible to the user, so I took a slightly different approach in a solution:

    I first created a routine that will search for a view's parent scroll view. This way I didn't need a bunch of DIM's for all the different scrollviews in order to be able to work with just one of them.

    Sub GetParentScrollView (V As ViewAs Object
    'returns the scrollview that is parent to the passed view (or returns non scrollview object if not found/error)
        'this allows accessing a particular scrollview from among many contained in an activity without requiring a unique declaration for each scrollview
    Dim FoundIt As Boolean = False
    Do While FoundIt = False
    Dim P As Object
                P = V.parent
    Return P
    End Try
    If P Is ScrollView Then
                FoundIt = 
                V = P
    End If

    Return P
    End Sub
    Then I have this code in the keyboard event:

    Sub IME_HeightChanged(NewHeight As Int, OldHeight As Int)
    Dim R As Object
    Select Case tabIcon.CurrentPage
    Case 0
                R = Misc.GetParentScrollView(txtName)
    Case 2
                R = Misc.GetParentScrollView(txtTextMessage)
    End Select
    If R Is ScrollView Then
            sv = R
            sv.Height = NewHeight - ActionBar.Height - 
    50dip 'tab header height
        End If
    End Sub
    I was actually surprised to see that you also used a constant of '50' for the tab height when calculating the scrollview height because there is no "tabMain.height" property to use in a calculation. My thought was that using a fixed value would not be a good value to depend on because it could vary from device to device. But I guess it's not.
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice