У меня есть 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
остается видимой, и только белая часть фона была заменена серым. Здесь выполняется захват экрана:
По подозрению, я заменил цвет, который я назначал с помощью 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);
Это обеспечивает желаемый результат, как показано ниже:
Почему назначение прямоугольника в качестве фона для элемента ListView
охватывает весь вид, а присвоение цвета позволяет черной границе показывать? Я рад, что это работает, но я хотел бы знать, почему Android делает представление таким образом, поэтому я могу узнать больше о том, как Android отображает Views.
light_gray
кажется более темным, чем light_gray
shape
light_gray
. Я сомневаюсь, что это имеет значение, но light_gray
:
<color name="light_gray">#FFCCCCCC</color>
Вы не можете этого сделать:
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)