Ich habe eine Activity
mit zwei Fragment
s (eine Liste eine normale). Und das normale Fragment
Aufblasen Scrollview
enthält ein LineaLayout
(vertikal) und dieses Layout enthält TextViews
. Das ScrollView
und layout_width
und layout_height
sind 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!
Antworten:
Wenn ich mich nicht irre, wird die
ViewGroup
Höhe des '(LinearLayout
in Ihrem Fall die Höhe),ScrollView
dh das (einzige) Kind in a , immer als wrap_content interpretiert, da dieser Inhalt größer sein kann als dieScrollView
Höhe des ' (daher die Bildlaufleisten).Dies bedeutet auch, dass wenn der Inhalt kleiner ist , der
ScrollView
Inhalt (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 dasScrollView
Problem:<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">
quelle
LinearLayout
genug 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!android:layout_height="match_parent"
sollte seinandroid:layout_height="wrap_content"
<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
ScrollView
Sie ein Attribut hinzu, dh.android:fillViewport="true"
quelle
android:layout_height="fill_parent"
sollte seinandroid:layout_height="wrap_content"
inflater.inflate(R.layout.menu_content_main, container);
sollte sein
inflater.inflate(R.layout.menu_content_main, container, false);
quelle
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" />
quelle
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>
quelle