android studio - ScrollView Layout non riempie l'intero schermo




add xml (5)

Ho avuto un problema simile e ho potuto risolverlo solo con una classe di supporto. Ho trovato il codice originale online e questa è la mia implementazione.

Classe Java:

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" />

Ho ottenuto un'attività con due Fragment (una lista una normale). E il normale Fragment gonfia una Scrollview contenente un LineaLayout (verticale) e questo layout contiene TextViews . ScrollView e layout_width e layout_height sono match_parent , quindi penso che si debba usare l'intero schermo. Ma in fondo c'è ancora un "vuoto". Spero che puoi aiutarmi.

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>

il frammento che gonfia questo 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 };
}

Molte grazie.

Modifica: Anche il problema è già stato risolto con: android: fillViewPort = "true", voglio mostrarti il ​​problema.

Ma non ho abbastanza reputazione per pubblicare una foto. Scusate!


<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" >

Nel tuo ScrollView aggiungi un attributo es.

android:fillViewport="true"

Se non sbaglio, l'altezza del LinearLayout (l'altezza di LinearLayout nel tuo caso), che è il (solo) bambino all'interno di una ScrollView , è sempre interpretata come wrap_content, dal momento che quel contenuto può essere più grande del ScrollView . altezza (da cui le barre di scorrimento).

Ciò significa anche che se il contenuto è più piccolo , il contenuto (figlio) di ScrollView potrebbe non necessariamente allungarsi per riempire lo schermo.

Per aiutarti visivamente a risolvere questo problema, dobbiamo vedere uno screenshot del tuo problema.

Forse impostando android:fillViewport="true" su ScrollView risolverà il tuo problema:

<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">

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

dovrebbe essere

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

Questo attributo è fondamentalmente la persistenza per la selezione "Attività associata" sopra il layout. In fase di esecuzione, un layout è sempre associato a un'attività. Naturalmente può essere associato a più di uno, ma almeno a uno. Nello strumento, è necessario conoscere questa mappatura (che in fase di esecuzione avviene nell'altra direzione, un'attività può chiamare setContentView (layout) per visualizzare un layout) al fine di pilotare determinate funzionalità.

In questo momento, lo stiamo usando solo per una cosa: Scegliere il tema giusto da mostrare per un layout (poiché il file manifest può registrare i temi da utilizzare per un'attività , e una volta che conosciamo l'attività associata al layout, possiamo scegliere il tema giusto da mostrare per il layout). In futuro, lo utilizzeremo per potenziare funzionalità aggiuntive, come il rendering della barra delle azioni (che è associata all'attività), una posizione per aggiungere gestori onClick, ecc.

Il motivo per cui questo è uno strumento: l'attributo namespace è che questa è solo una mappatura di design per l'utilizzo da parte dello strumento. Il layout stesso può essere utilizzato da più attività / frammenti, ecc. Vogliamo solo darti un modo per scegliere un binding di design in modo tale che possiamo ad esempio mostrare il tema giusto; puoi cambiarlo in qualsiasi momento, proprio come puoi cambiare il nostro listview e frammentare binding, ecc.

(Ecco il changeset completo che ha maggiori dettagli su this )

E sì, here Nikolay elencato sopra mostra come il nuovo selettore di configurazione sembra e funziona

Un'altra cosa: il namespace "tools" è speciale. Lo strumento di packaging Android sa di ignorarlo, quindi nessuno di questi attributi verrà inserito nell'APK. Lo stiamo utilizzando per ulteriori metadati nel layout. È anche il caso in cui, ad esempio, vengono memorizzati gli attributi per sopprimere gli avvertimenti sui pelucchi - come strumenti: ignorare.







android android-layout android-fragments