Das ScrollView-Layout füllt nicht den gesamten Bildschirm aus

73

Ich habe eine Activitymit zwei Fragments (eine Liste eine normale). Und das normale FragmentAufblasen Scrollviewenthält ein LineaLayout(vertikal) und dieses Layout enthält TextViews. Das ScrollViewund layout_widthund layout_heightsind match_parent, also denke ich, dass der gesamte Bildschirm verwendet werden sollte. Aber unten gibt es immer noch eine "Lücke". Ich hoffe ihr könnt mir helfen.

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>

das Fragment, das dieses Layout aufbläst.

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 };
}

Vielen Dank.

Bearbeiten: Auch das Problem ist bereits behoben mit: android: fillViewPort = "true", ich möchte Ihnen das Problem zeigen.

Aber ich habe nicht genug Ruf, um ein Bild zu posten. Es tut uns leid!

j0chn
quelle
1
Kannst du einen Screenshot posten?
FoamyGuy

Antworten:

277

Wenn ich mich nicht irre, wird die ViewGroupHöhe des '( LinearLayoutin Ihrem Fall die Höhe), ScrollViewdh das (einzige) Kind in a , immer als wrap_content interpretiert, da dieser Inhalt größer sein kann als die ScrollViewHöhe des ' (daher die Bildlaufleisten).

Dies bedeutet auch, dass wenn der Inhalt kleiner ist , der ScrollViewInhalt (untergeordnet) des Bildschirms möglicherweise nicht unbedingt gedehnt wird, um den Bildschirm auszufüllen.

Um Ihnen visuell dabei zu helfen, dieses Problem zu beheben, benötigen wir einen Screenshot Ihres Problems.

Vielleicht behebt die Einstellung android:fillViewport="true"auf das ScrollViewProblem:

<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">
Straßen von Boston
quelle
19
Der fillViewPort hat das Problem behoben. Vielen Dank!!
j0chn
1
In Bezug auf "das ist das (einzige) Kind in einer ScrollView, wird immer als wrap_content interpretiert, da dieser Inhalt größer sein kann als die Höhe der ScrollView (daher die Bildlaufleisten)": Zeigen Sie mir bitte den Quellcode, der dies tut?
In meinem Fall hatte das Kind LinearLayoutgenug Inhalt, um mehr als den Bildschirmplatz einzunehmen, aber dennoch füllte die Bildlaufansicht den Bildschirm nicht aus und ließ etwa 10% des Bildschirms unten. fillViewPort hat das Problem behoben. Ich hatte seit gestern mit dem Code rumgespielt. Du bist der Retter!
TM
Yeas fillViewport = "true" ist diese erstaunliche Sache, die die Bildlaufansicht auf die gesamte Bildschirmhöhe ausdehnt und es ermöglicht, den Inhalt in der Bildlaufansicht in der Mitte des Bildschirms festzulegen
Michał Ziobro,
android:layout_height="match_parent"sollte seinandroid:layout_height="wrap_content"
Jimit Patel
8
<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" >

Fügen ScrollViewSie ein Attribut hinzu, dh.

android:fillViewport="true"
Trojanisches Pferd
quelle
android:layout_height="fill_parent"sollte seinandroid:layout_height="wrap_content"
Jimit Patel
2
inflater.inflate(R.layout.menu_content_main, container);

sollte sein

inflater.inflate(R.layout.menu_content_main, container, false);
Alex
quelle
1
Nein, das war nicht das Problem.
j0chn
0

Ich hatte ein ähnliches Problem und konnte es nur mit einer Helferklasse beheben. Ich habe den Originalcode online gefunden und dies ist meine Implementierung.

Java-Klasse:

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" />
Dan Oprean
quelle
0

Ersetzen Sie ScrollView durch NestedScrollView, um das Problem des verschachtelten Bildlaufs zu lösen.

<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>
RUSHIKESH KARDE
quelle