Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ScrollView scrolls to top after calling setVisibility(View.VISIBLE) on child view

I have a ScrollView with a RelativeLayout inside it. This RelativeLayout then has several Views inside it. One of these several Views is a CheckBox. When the CheckBox is checked/unchecked, some of the other Views should appear/disappear accordingly.The appearing and disappear is working fine, but every time the target Views appear or disappear, the ScrollView scrolls all the way to the top and I'm forced to scroll down to see what happened.

The code I use to control visibility is:

public void crossCountryCheckboxClicked(View view)
{
    CheckBox crossCountryCheckBox = (CheckBox)findViewById(R.id.checkbox_cross_country);
    EditText crossCountryHoursTextBox = (EditText)findViewById(R.id.cross_country_hours);
    if (crossCountryCheckBox.isChecked())
    {
        crossCountryHoursTextBox.setVisibility(View.VISIBLE);
    }
    else
    {
        crossCountryHoursTextBox.setVisibility(View.GONE);
    }
}

and the crossCountryCheckboxClicked() method is called by specifying the android:onClick attribute on the CheckBox element in the XML layout file.

Here is the XML layout file:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res/logbook.app.activities"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/flight_date"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/aeroplane_type"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/flight_date"
        android:hint="@string/aeroplane_type" />

    <EditText
        android:id="@+id/aeroplane_registration"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/aeroplane_type"
        android:hint="@string/aeroplane_registration" />

    <EditText
        android:id="@+id/pilot_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/aeroplane_registration"
        android:hint="@string/pilot_name" />

    <EditText
        android:id="@+id/copilot_name"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/pilot_name"
        android:hint="@string/copilot_name" />

    <EditText
        android:id="@+id/from_aerodome"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/copilot_name"
        android:hint="@string/from_aerodome" />

    <EditText
        android:id="@+id/to_aerodome"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/copilot_name"
        android:layout_toRightOf="@id/from_aerodome"
        android:hint="@string/to_aerodome" />

    <EditText
        android:id="@+id/remarks"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/from_aerodome"
        android:hint="@string/remarks" />

    <Spinner
        android:id="@+id/aircraft_engine_type_spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/remarks" />

    <Spinner
        android:id="@+id/time_of_day_spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/aircraft_engine_type_spinner" />

    <Spinner
        android:id="@+id/pilot_role_spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/time_of_day_spinner" />

    <TextView
        android:id="@+id/on_time"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/pilot_role_spinner"
        android:hint="@string/on_time_hint" />

    <TextView
        android:id="@+id/takeoff_time"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/on_time"
        android:hint="@string/takeoff_time_hint" />

    <TextView
        android:id="@+id/landing_time"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/takeoff_time"
        android:hint="@string/landing_time_hint" />

    <TextView
        android:id="@+id/off_time"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/landing_time"
        android:hint="@string/off_time_hint" />

    <Button
        android:id="@+id/button_record"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/off_time"
        android:onClick="recordTime"
        android:padding="5dp"
        android:text="@string/button_record" />

    <Button
        android:id="@+id/button_reset"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/off_time"
        android:layout_toRightOf="@id/button_record"
        android:onClick="resetAllTimes"
        android:padding="5dp"
        android:text="@string/button_reset" />

    <CheckBox
        android:id="@+id/checkbox_ifr"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button_record"
        android:text="@string/checkbox_ifr"
        android:onClick="ifrCheckboxClicked" />

    <CheckBox
        android:id="@+id/checkbox_cross_country"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/button_record"
        android:layout_toRightOf="@id/checkbox_ifr"
        android:text="@string/checkbox_cross_country"
        android:onClick="crossCountryCheckboxClicked" />

    <Spinner
        android:id="@+id/ifr_type_spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/checkbox_ifr"
        android:visibility="gone" />

    <TextView
        android:id="@+id/label_ifr_approaches"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/ifr_type_spinner"
        android:hint="@string/ifr_landings_label"
        android:visibility="gone" />

    <logbook.app.custom.widgets.NumberSelector
        android:id="@+id/ifr_landings_selector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/label_ifr_approaches"
        android:visibility="gone"
        custom:orientation="vertical" />

    <EditText
        android:id="@+id/ifr_hours"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/ifr_landings_selector"
        android:hint="@string/ifr_hours_hint"
        android:inputType="number"
        android:visibility="gone" />

    <EditText
        android:id="@+id/cross_country_hours"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/ifr_hours"
        android:hint="@string/cross_country_hours_hint"
        android:inputType="number"
        android:visibility="gone" />

    <TextView
        android:id="@+id/label_takeoffs_landings"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/cross_country_hours"
        android:hint="@string/takeoffs_landings_label" />

    <logbook.app.custom.widgets.NumberSelector
        android:id="@+id/landings_selector"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/label_takeoffs_landings"
        custom:orientation="horizontal" />

    <Button
        android:id="@+id/button_create_log"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/landings_selector"
        android:onClick="createLog"
        android:padding="5dp"
        android:text="@string/button_create_log" />

</RelativeLayout>

How can I stop the ScrollView from scrolling to the top every time one of its children's visibilities is changed between View.GONE and View.Visible?

like image 243
faridghar Avatar asked Nov 01 '12 00:11

faridghar


People also ask

What is fillViewport in ScrollView?

fillViewport allows scrollView to extend it's height equals to the full height of device screen's height in the cases when the child of scroll view has less height.

Which scrolling is supported by ScrollView?

A ScrollView supports Vertical scrolling only, so in order to create a horizontally scrollable view, HorizontalScrollView is used.

What is the difference between ScrollView and ListView?

ScrollView is used to put different or same child views or layouts and the all can be scrolled. ListView is used to put same child view or layout as multiple items. All these items are also scrollable. Simply ScrollView is for both homogeneous and heterogeneous collection.


1 Answers

I think you want to scrolldown you scrollbar at new visible view crossCountryHoursTextBox for that just scroll your scrollbar like this

// scrollview at visible textbox
yourscroll.smoothScrollBy(0,crossCountryHoursTextBox.getTop()); 
like image 200
pRaNaY Avatar answered Sep 23 '22 14:09

pRaNaY