Почему назначение цвета фону моего элемента ListView не покрывает весь фон ListView, в то время как назначение рисования делает?

1

У меня есть ListView который сидит на левой стороне экрана планшета. Моя цель состояла в том, чтобы дать ему сплошной фон с границей справа, а затем применить перекрывающийся фон в элементе списка, чтобы сломать эту границу, чтобы он оказался частью представления справа.


Фон списка ListView

Я добился правильной границы, используя <layer-list> как было предложено Эмилем, в другом вопросе:

rightborder.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/black" />
        </shape>
    </item>
    <item android:right="2dp">
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
        </shape>
    </item>

</layer-list>

... и вот определение ListView для хорошей меры:

<ListView
    android:id="@+id/msglist"
    android:layout_width="300dp"
    android:layout_height="match_parent"
    android:divider="@color/black"
    android:dividerHeight="1dp"
    android:background="@drawable/rightborder"
    android:paddingRight="0dip">
</ListView>
<!-- I added the android:paddingRight after reading something 
about shape drawables and padding, don't think it actually
did anything. -->

Попытка переопределить его цветом

Чтобы добиться желаемого эффекта, я поместил в функцию getView моего адаптера следующее:

//If it selected, highlight the background
if(position == mSelectedIndex)
    convertView.setBackgroundColor(R.color.light_gray);

else
    convertView.setBackgroundResource(0);

Однако, используя этот метод, черная рамка списка ListView остается видимой, и только белая часть фона была заменена серым. Здесь выполняется захват экрана:

Изображение 174551


Прикрепление

По подозрению, я заменил цвет, который я назначал с помощью shape:

selectedmessage.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape android:shape="rectangle"
    xmlns:android="http://schemas.android.com/apk/res/android" >
    <solid android:color="@color/light_gray" />
</shape>

getView:

//If it selected, highlight the background
if(position == mSelectedIndex)
    convertView.setBackgroundResource(R.drawable.selectedmessage);

else
    convertView.setBackgroundResource(0);

Это обеспечивает желаемый результат, как показано ниже:

Изображение 174551


Вопрос:

Почему назначение прямоугольника в качестве фона для элемента ListView охватывает весь вид, а присвоение цвета позволяет черной границе показывать? Я рад, что это работает, но я хотел бы знать, почему Android делает представление таким образом, поэтому я могу узнать больше о том, как Android отображает Views.

Другие примечания:

  • Я запускаю проект в эмуляторе Android 3.2, если это имеет значение.
  • Один из признаков может заключаться в том, что цветной фон light_gray кажется более темным, чем light_gray shape light_gray.
  • Я сомневаюсь, что это имеет значение, но light_gray:

    <color name="light_gray">#FFCCCCCC</color>

Теги:
user-interface
android-layout

1 ответ

1
Лучший ответ

Вы не можете этого сделать:

 convertView.setBackgroundColor(R.color.light_gray);

setBackgroundColor не принимает идентификатор ресурса: http://developer.android.com/reference/android/view/View.html#setBackgroundColor ( int )

Таким образом, вы получаете какое-то случайное поведение, которое не делает то, что вы ожидаете.

Вам нужно будет:

 convertView.setBackgroundColor(getResources().getColor(R.color.light_gray);

http://developer.android.com/reference/android/content/res/Resources.html#getColor(int)

  • 0
    Ну, ладно, исходя из этого, похоже, что я получаю темный цвет с неожиданным полупрозрачным альфа-значением, потому что он пытался использовать целое число ресурса в качестве цвета, и граница показала это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню