Центрируйте элементы HorizontalScrollView, когда его недостаточно для прокрутки - PullRequest
14 голосов
/ 23 марта 2012

У меня есть макет с HorizontalScrollView, содержащий LinearLayout для меню, в котором содержимое надувается содержимым БД. Это работает нормально, однако, когда недостаточно элементов для прокрутки HSV, это не занимает всю ширину экрана, которая в идеале должна быть центрирована. то есть В настоящее время:

| Element 1 Element 2                         | <- edge of screen

Вместо:

|        Element 1            Element 2       | <- edge of screen

пока еще может:

| Element 1 Element 2 Element 3 Element 4 Elem| <- edge of screen now scrolling

XML-формат:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLinearLayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView 
         android:id="@+id/header"
         android:layout_width="fill_parent"
         android:layout_height="25dp" >
    </TextView>

    <ScrollView
         android:id="@+id/scroll1"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_weight="1" >

        <LinearLayout
             android:id="@+id/contentLayout"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:orientation="vertical" >

        </LinearLayout>
    </ScrollView>

    <HorizontalScrollView
        android:id="@+id/horizontalScrollView1"
        android:layout_width="fill_parent"
        android:layout_height="30dp">

        <LinearLayout
            android:id="@+id/footerLayout"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="horizontal" >

        </LinearLayout>
   </HorizontalScrollView>
</LinearLayout>

Со следующим XML, раздуваемым внутри footerLayout:

<?xml version="1.0" encoding="utf-8"?>

        <TextView
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/footer_content"
            android:textSize="18sp"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:paddingLeft="5dp"
            android:paddingRight="5dp"
            android:text="FOOTER"
            android:singleLine="true" />

Ответы [ 5 ]

25 голосов
/ 29 апреля 2013

Я только что решил эту проблему. Я столкнулся с этим несколько часов назад. Вам необходимо центрировать HorizontalScrollView в его родительском элементе и установить его ширину / высоту равным wrap_content. Макет, который вы вставляете в HSV, должен также иметь ширину / высоту для переноса содержимого. Важная часть здесь - не устанавливать гравитацию / layout_gravity для этого макета, иначе у вас могут возникнуть (очень раздражающие) проблемы с обрезкой после надувания ваших просмотров. Пример ниже содержится в RelativeLayout.

 <HorizontalScrollView  android:id="@+id/svExample"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_below="@id/rlExample">
    <LinearLayout
        android:id="@+id/llExample"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    </LinearLayout>
</HorizontalScrollView >
5 голосов
/ 11 декабря 2013

У меня была такая же проблема, и, наконец, она заработала.Вот минимальный пример:

Основной макет активности с HorizontalScrollView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fillViewport="true" >

        <LinearLayout
            android:id="@+id/container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
        </LinearLayout>

    </HorizontalScrollView>

</LinearLayout>

Макет элементов, которые будут раздуты и помещены в представление прокрутки:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="your text" />

</LinearLayout>

И это пример кода для раздувания и добавления элементов:

LinearLayout container = (LinearLayout) findViewById(R.id.container);
LayoutParams elementLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f);
int elementCount = 3; // ...or however many you like
for (int i = 0; i < elementCount; i++) {
    LinearLayout element = (LinearLayout) getLayoutInflater().inflate(R.layout.element, null);
    container.addView(element, elementLayoutParams);
}

В основном он основан на методе расширения содержимого ScrollViews, объясненной в этой статье Ромена Гая.

Однако в этом случае, когда вы добавляете содержимое динамически, другой ключевой момент - установка положительного значения для веса (1f в этом примере) с использованием LayoutParams при добавлении элементов в контейнер.Если у вас есть статический набор элементов, который вы можете включить непосредственно в контейнер, и вам не нужно его раздувать, вы можете указать вес внешнего LinearLayout элементов в XML-макете следующим образом:

android:layout_weight="1"

Но если вы сделаете это динамически, это не сработает, потому что вес сбрасывается до 0 и элементы разрушаются.Следовательно, вам нужно установить его через LayoutParams.

3 голосов
/ 06 ноября 2015

Ниже приведен самый простой способ, сработавший для меня.

<HorizontalScrollView
    android:id="@+id/horizontalScrollView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:layout_gravity="center">

    <LinearLayout
        android:id="@+id/layout_others"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</HorizontalScrollView>
1 голос
/ 26 марта 2012

удалось обойти центральное горизонтальное отсечение левой стороны:

HorizontalScrollView часть макета была изменена на:

<LinearLayout 
    android:id="@+id/footerWrapperLayoutToGetAroundCenteringIssue"
    android:orientation="horizontal" 
    android:layout_width="fill_parent"
    android:layout_height="50dp"
    android:gravity="center_horizontal">

    <HorizontalScrollView 
        android:id="@+id/horizontalScrollView1"
        android:layout_height="fill_parent" 
        android:layout_width="wrap_content">
        <LinearLayout 
            android:id="@+id/footerLayout" 
            android:orientation="horizontal" 
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">
        </LinearLayout>
    </HorizontalScrollView>
</LinearLayout>

Жаль только, когда он центрирует их, они неравномерно распределенные.

Если у кого-то есть идеи, пожалуйста, дайте мне знать.

0 голосов
/ 23 марта 2012

присваивает тексту 1 вид в завышенном виде и задает ширину обтекания

...