ScrollView Layout does not fill the whole screen

AndroidAndroid LayoutAndroid Fragments

Android Problem Overview


I got an Activity with two Fragments (one list one normal). And the normal Fragment inflates a Scrollview containing a LineaLayout (vertical) and this layout contains TextViews. The ScrollView and layout_width and layout_height are match_parent, so I think the whole screen should be used. But on the bottom there is still a "gap". I hope you can help me.

ScrollView.xml

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/titlescreen_bg"
    android:orientation="vertical"
    android:paddingTop="60dp"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/tv_headline"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:paddingBottom="60dp"
        android:paddingTop="60dp"
        android:textIsSelectable="false"
        android:textSize="@dimen/fontsize_slogan_titlescreen" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:paddingBottom="30dp"
        android:paddingTop="30dp"
        android:textIsSelectable="false"
        android:textSize="@dimen/fontsize_slogan_titlescreen" />
</LinearLayout>

</ScrollView>

the fragment inflating this layout.

package wak.iage.layout;

import wak.iage.R;
import android.app.Fragment;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MenuContentFragment extends Fragment
{
LinearLayout.LayoutParams	relativeParams	= new LinearLayout.LayoutParams(
													LayoutParams.MATCH_PARENT,
													LayoutParams.MATCH_PARENT);
LinearLayout				topLayout		= null;
TextView					body			= null;
TextView					head			= null;

@Override
public void onActivityCreated(Bundle savedInstanceState) {
	super.onActivityCreated(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
		Bundle savedInstanceState) {
	View v = inflater.inflate(R.layout.menu_content_main, container);
	return v;
}

public void changeText(String title, String content) {
	topLayout = (LinearLayout) getActivity().findViewById(
			R.id.LinearLayout1);
	head = (TextView) getActivity().findViewById(R.id.tv_headline);
	body = (TextView) getActivity().findViewById(R.id.tv_content);

	if (body == null) {
		topLayout.removeViews(1, topLayout.getChildCount() - 1);
		body = new TextView(getActivity().getApplicationContext());
		body.setPadding(0, 30, 0, 20);
		body.setTextColor(Color.BLACK);
		body.setTextSize(22);
		body.setGravity(Gravity.CENTER_HORIZONTAL);
		topLayout.addView(body, relativeParams);
	}

	body.setText(content);
	head.setText(title);
}

public void addGlossary() {
	if (body != null) {
		topLayout.removeView(body);
	}

	int i = 0;

	for (int id : GLOSSARY) {
		TextView glossary = new TextView(getActivity()
				.getApplicationContext());
		glossary.setText(getString(id));
		glossary.setTextColor(Color.BLACK);
		if (i % 2 == 0) {
			glossary.setTypeface(Typeface.DEFAULT_BOLD);
			glossary.setTextSize(22);
			glossary.setPadding(0, 10, 0, 10);
		}
		topLayout.addView(glossary, relativeParams);
		i += 1;
	}
}

public static final int[]	GLOSSARY	= {
		R.string.GlossaryAndroidOSTitle, R.string.GlossaryAndroidOSContent,
		R.string.GlossaryAppTitle, R.string.GlossaryAppContent,
		R.string.GlossaryCloudTitle, R.string.GlossaryCloudContent,
		R.string.GlossaryDonwloadTitle, R.string.GlossaryDonwloadContent,
		R.string.GlossaryFacebookTitle, R.string.GlossaryFacebookContent,
		R.string.GlossaryGPSTitle, R.string.GlossaryGPSContent,
		R.string.GlossaryHomescreenTitle,
		R.string.GlossaryHomescreenContent, R.string.GlossaryPasswordTitle,
		R.string.GlossaryPasswordContent, R.string.GlossaryRouterTitle,
		R.string.GlossaryRouterContent, R.string.GlossarySDTitle,
		R.string.GlossaySDContent, R.string.GlossayStandbyTitle,
		R.string.GlossayStandbyContent, R.string.GlossaryTabletTitle,
		R.string.GlossaryTabletContent, R.string.GlossaryTouchscreenTitle,
		R.string.GlossaryTouchscreenContent, R.string.GlossayWidgetsTitle,
		R.string.GlossayWidgetsContent, R.string.GlossayWLANTitle,
		R.string.GlossayWLANContent	};
}

Thanks a lot.

Edit: Even the proble is already fixed with: android:fillViewPort="true", I want to show you the problem.

But I don't have enough reputation to post a picture. Sorry!

Android Solutions


Solution 1 - Android

If i'm not mistaken, the ViewGroup's height (LinearLayout's height in your case), that is the (only) child inside a ScrollView, is always interpreted as wrap_content, since that content can be larger than the ScrollView's height (hence the scrollbars).

This also means that if the content is smaller, the ScrollView's content (child) may not necessarily stretch to fill the screen.

In order to visually help you fix this, we need to see a screenshot of your problem.

Maybe setting android:fillViewport="true" on the ScrollView will fix your issue:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

Solution 2 - Android

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:fadeScrollbars="false"
    android:scrollbars="vertical" >

In your ScrollView add an attribute ie.

android:fillViewport="true"

Solution 3 - Android

inflater.inflate(R.layout.menu_content_main, container);

should be

inflater.inflate(R.layout.menu_content_main, container, false);

Solution 4 - Android

Replace ScrollView with NestedScrollView it will also solve the problem of nested scrolling.

<androidx.core.widget.NestedScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/scrollView1"
android:layout_width="match_parent"
android:layout_height="match_parent">

</androidx.core.widget.NestedScrollView>

Solution 5 - Android

I had a similar problem and could only fix it with a Helper Class. I found the original code online and this is my implementation of it.

Java class:
public class ImageViewHelper extends android.support.v7.widget.AppCompatImageView {

    public ImageViewHelper(Context context) {
        super(context);
    }

    public ImageViewHelper(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ImageViewHelper(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable d = getDrawable();
        if (d != null) {
            int w = MeasureSpec.getSize(widthMeasureSpec);
            int h = w * d.getIntrinsicHeight() / d.getIntrinsicWidth();
            setMeasuredDimension(w, h);
        }
        else super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

XML:
<com.example.app.ImageViewHelper
    android:id="@+id/img"
    android:src="@drawable/start"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:adjustViewBounds="true" />

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionj0chnView Question on Stackoverflow
Solution 1 - AndroidStreets Of BostonView Answer on Stackoverflow
Solution 2 - AndroidTrojan HorseView Answer on Stackoverflow
Solution 3 - AndroidalexView Answer on Stackoverflow
Solution 4 - AndroidRUSHIKESH KARDEView Answer on Stackoverflow
Solution 5 - AndroidDan OpreanView Answer on Stackoverflow