Подтвердить что ты не робот

Просмотр нижнего колонтитула на Android 2.3.3

Это странно. У меня есть представление списка, которое является частью Relative Layout. Я задал предпосылки для этой относительной компоновки и сделал фон списка просмотра прозрачным.

Теперь все отлично работало до сегодняшнего утра. Я мог видеть, что весь экран покрыт моим пользовательским фоном, даже если в моем списке есть только одна строка.

Затем я получил обновление на Verizon Motorola Droid X для 2.3.3 (это было 2.2 раньше). Как только он был обновлен, я снова начал свое приложение, и теперь вот что происходит.

Если в моем списке есть только одна строка, я вижу белую область под ней, а не свой собственный фон. Но если он скажет 100 строк и, таким образом, покрывает весь экран, я не увижу этого странного белого фона. Мой относительный макет имеет ширину и высоту, равную "fill_parent".

Я разместил свой XML внизу. Кто-нибудь еще столкнулся с этой проблемой, или я делаю какую-то действительно глупую ошибку.

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background = "@drawable/background" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView   android:id = "@+id/listQueue"
                android:layout_width = "fill_parent"
                android:layout_height = "fill_parent"
                android:layout_below = "@id/homeScreenBanner"
                android:background="@android:color/transparent"
                android:divider="@drawable/separator"
                android:scrollingCache="false"/>
</RelativeLayout>

EDIT:

Я думаю, что нашел решение этой проблемы:

Изменен атрибут layout_height для wrap_content, и он работает как шарм.:)

Следуя измененной строке.   android:layout_height = "wrap_content"

4b9b3361

Ответ 1

Я написал класс, который можно использовать в Android 2.1/2, который пойдет правильно в 2.3, используя отражение с ListViews:

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.ListView;

public class TransparentListView extends ListView {

    private void makeTransparent() {
        if (Build.VERSION.SDK_INT >= 9) {
            try {

                Method overscrollFooterMethod = 
                    TransparentListView.class.getMethod("setOverscrollFooter", new Class[] {Drawable.class});
                Method overscrollHeaderMethod = 
                    TransparentListView.class.getMethod("setOverscrollHeader", new Class[] {Drawable.class});


                try {
                    overscrollFooterMethod.invoke(this, new Object[] {null});
                    overscrollHeaderMethod.invoke(this, new Object[] {null});
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                }
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        }
    }

    public TransparentListView(Context context) {
        super(context);
        this.makeTransparent();
    }

    public TransparentListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.makeTransparent();
    }

    public TransparentListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.makeTransparent();
    }
}

Используйте его в XML следующим образом:

<com.myapp.TransparentListView android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:transcriptMode="alwaysScroll"
    android:layout_weight="1"
    android:dividerHeight="0dip"
    android:divider="#00000000"
    android:cacheColorHint="#00000000"
/>  

Ответ 2

На самом деле это простое решение этой проблемы, используя основные макеты, полностью реализованные в файле макета XML.

Во-первых, предложение блога Motorola неприемлемо, потому что для его создания требуется использовать API v2.3, чтобы использовать "android:overScrollFooter" для принудительной или множественной сборки или недоступности большинства устройств Android.

Предложение по установке ListView android:layout_height="wrap_content" работает во многих случаях и очень полезно, если нет элементов макета под списком ListView.

Проблема возникает, когда есть один или несколько представлений выше и один или несколько представлений ниже списка. Для этого требуется установить как android:layout_below, так и android:layout_above для ListView, который растягивает высоту ListView до высоты доступного пространства, которое больше, чем необходимое "wrap_content". Когда это происходит, "Bug" запускается - дополнительное пространство внизу списка ListView заполняется цветом фона по умолчанию нижнего колонтитула, который является темно-серым и не прозрачным.

Теперь для простого решения.

Поместите ListView внутри вертикального LinearLayout или его эквивалента. Позвольте LinearLayout располагаться сверху вниз с доступным пространством с помощью height="fill_parent", дополнительные будут заполнены правильным фоном или цветом. Задайте высоту списка ListView "wrap_content", чтобы не было неиспользуемого пространства для незазрачного серого фона нижнего колонтитула.

Вот пример:

<Button> android:[email protected]+id/MyTopButton" ... </Button>
<Button> android:[email protected]+id/MyBottomButton" android:layout_alignParentBottom="true" ... </Button>

<LinearLayout
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:orientation="vertical"
    android:layout_below="@+id/MyTopButton"
    android:layout_above="@+id/MyBottomButton"
    >

    <!-- Note: This is a bug fix for a particular problem experienced on 
         Motorola OS v2.3.3 devices only in which the space below the unused 
         portion of the ListView is rendered in gray instead of the desired 
         transparent 'cacheColorHint' color. This solution which wraps the 
         ListView in another container (a LinearLayout in this case) allows 
         the ListView to be of height "wrap_content" while the parent 
         container is forced to be the desired height - namely from the 
         header area above down to the buttons below. -->

    <ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/MyList"
        android:cacheColorHint="#00000000"
        />

</LinearLayout>

Ответ 3

Да, решение David работает в некоторых случаях и позволяет вам строить с Android до 2.3. На самом деле это первое решение, которое я опубликовал на форуме MotoDev с загружаемым кодом образца еще в июне.

Однако некоторые разработчики сказали, что он оставляет артефакт (что означает: блуждающая горизонтальная серая линия внизу списка). Я сам это видел. Это не работает для тех, кто заботится о деталях дизайна. Решение android:overScrollFooter="@null" не оставляет артефакта. Но вы правы, чтобы использовать его, вам нужно построить с Android 2.3 или выше.

Ответ 4

См. Motorola сообщение в блоге об этом поведении - ответ таков: на Motoblur 2.3 они устанавливают нижний колонтитул по умолчанию, который можно устранить настройка android:overScrollFooter="@null", но только для Android 2.3+.

Рекомендуемое решение для приложений - это использовать настраиваемую тему с настраиваемым listViewStyle, установленным только в папке values-v10 с этим набором свойств.

Ответ 5

Можете ли вы попробовать, чтобы параметр cacheColorHint вашего ListView был прозрачным?

Android: cacheColorHint = "@андроид: цвет/прозрачный"