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

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

Posted by: admin May 14, 2020 Leave a comment

Questions:

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?

How to&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()); 

Answer:

Try this:

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation = "vertical" >

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

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_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>
</ScrollView>
</LinearLayout>