LinearLayout não está expandindo dentro de um ScrollView

371

Eu tenho um LinearLayoutinterior ScrollViewque possui android:layout_height="fill_parent", mas ele não se expande para a altura total do ScrollView. Meu layout se parece com:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

Eu posso ver que LinearLayoutele não expande toda a altura do ScrollViewporque no Eclipse Android Layout Editor, se eu selecionar o ScrollView(no painel Estrutura de tópicos), ele será destacado com uma borda vermelha que preenche a tela até o fundo, mas quando eu seleciono o LinearLayoutdestaque não se expande para a parte inferior da tela. Como posso fazer isso?

O efeito que estou tentando obter é ter algum texto e um botão abaixo (dentro do LinearLayoutnível 4, há apenas um botão). O texto pode ser grande o suficiente para precisar de uma barra de rolagem. Nesse caso, desejo que o usuário precise rolar para baixo para ver o botão. Caso o texto não seja grande o suficiente para uma barra de rolagem, desejo LinearLayoutque o botão que contém o botão fique na parte inferior da tela.

No começo, pensei que não deveria postar o XML completo, porque geralmente é uma desvantagem ver um grande pedaço de código em uma pergunta. No entanto, parece que pode ser necessário, então aqui está o layout completo.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/video_layout"
        android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:foreground="@android:drawable/ic_media_play"
            android:foregroundGravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/video_thumb"
                android:padding="5dip"
                android:background="#454545"/>
        </FrameLayout>
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@style/VideoTitle"
            android:id="@+id/video_title"
            android:layout_gravity="center"
            android:layout_weight="1"/>
    </LinearLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:layout_gravity="fill"
            android:orientation="vertical"
            android:id="@+id/info_layout">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                style="@android:style/ButtonBar">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
                        android:text="@string/button_readmore"
                        android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

No momento, recorri à android:layout_gravity="bottom"problemática LinearLayout, que faz o botão grudar na parte inferior da tela, não importa o quê. Mas isso também faz com que o texto fique na parte inferior da tela, o que não é exatamente o que eu procurava.

Atualização: arranhar isso, android:layout_gravity="bottom"torna o ScrollViewincapaz de, bem, rolar. Outras idéias?

Felix
fonte

Respostas:

956

Encontrei a solução no final. O problema não era com o LinearLayout, mas com o ScrollView(parece estranho, considerando o fato de que o ScrollView estava se expandindo, enquanto o LinearLayoutnão estava).

A solução foi usar android:fillViewport="true"no ScrollView.

Felix
fonte
4
Observe que o LinearLayout se expandirá verticalmente, mas isso não necessariamente se reflete no seu layout, a menos que contenha um controle que consome esse espaço adicional usando android:weight.
Paul Lammertsma
Isso realmente ajuda. Obrigado por isso. Mas sem esse código, às vezes funciona bem. Você sabe por quê?
Ashokchakravarthi Nagarajan
não está funcionando para <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientação = "vertical"> </LinearLayout>
Prasad
3
Tão doente que fiquei sentado por horas e procurando o que havia de errado com meu código. Para que esse paramater? Quando você gostaria de defini-lo como falso?
MyWay
@Prasad fazer a sua altura de disposição linear de jogo pai
goonerDroid
22

Eu sei que este post é muito antigo, para quem não quer usar android:fillViewport="true"porque às vezes não traz o edittext acima do teclado. Use o layout relativo, em vez de LinearLayout, para resolver o objetivo.

Hardik4560
fonte
8

Você pode fornecer seu layout xml? Isso permitiria que as pessoas recriassem o problema com o mínimo esforço.

Você pode ter que definir

android:layout_weight="1"

para o item que você deseja expandir

snctln
fonte
11
Obrigado pela sua resposta. Eu tentei sua sugestão, mas não funcionou. Também atualizei minha pergunta para incluir o layout xml.
Felix
3

A solução é usar

android:fillViewport="true"

na visualização Scroll e, além disso, tente usar

"wrap_content"em vez de "fill_parent"como"fill_parent"

está obsoleto agora.

Khushboo Aggarwal
fonte
2

Eu tenho usado dinamicamente para conseguir isso. Eu tenho um LinearLayout e dentro deste ScrollView usado como filho. Então eu pego novamente o LinearLayout e adiciono o que você quiser a esse LinearLayout e, em seguida, o LinearLayout adiciona ao ScrollView e, finalmente, adiciona esse ScrollView ao LinearLayout. Então você pode obter a rolagem no seu ScrollView e nada será deixado visível.

LinearLayout (Pai) - ScrollView (filho de LinerLayout) - LinearLayout (filho de ScrollView) - adicione aqui textView, Buttons, spinner etc, o que você quiser. Em seguida, adicione este LinearLyout ao ScrollView. Bcoz apenas uma CRIANÇA para o ScrollView aplicável e, por último, adicione esse ScrollView ao LinearLyout. Se a área definida exceder o tamanho da tela, você obterá um Scroll no ScrollView.

Braj
fonte
Mas essa solução torna o xml mais complicado e leva mais tempo para inflar.
twlkyao
1

No meu caso, eu não dei o

orientação de LinearLayout (filho de ScrollView)

Portanto, por padrão, é horizontal, mas o scrollview é executado verticalmente; portanto, verifique se 'android: guidance = "vertical"' está definido como o filho do ScrollView (no caso de LinearLayout).

Este foi o meu caso, espero que ajude alguém

.

Vishal Pandey
fonte