2010-12-03 4 views
1

ExpandableListAdapter.getChildView에서 발생하는 문제를 디버그하려고합니다.Android GradientDrawable - Corner Radii 문제

목록 항목의 배경에 그라디언트와 반지름이 1 인 모서리가있는 모양이있는 드로어 블을 정의했습니다. 특별한 것은 없습니다.

그런 다음 내 어댑터 코드에서, 나는 getChildView 내에서이 조각이 여기

GradientDrawable background = (GradientDrawable) convertView.getBackground(); 
float topRadius = 0; 
float bottomRadius = 0; 

// Make the corner radius obvious for debugging    
if (childPosition == 0) 
    topRadius = 14; 
if (childPosition == (mValues.size() - 1)) 
    bottomRadius = 14; 

background.setCornerRadii(new float [] { topRadius, topRadius, 
             topRadius, topRadius, 
             bottomRadius, bottomRadius, 
             bottomRadius, bottomRadius}); 
convertView.setBackgroundDrawable(background); 

시도가 첫 번째 목록 항목의 맨 마지막 목록 항목의 바닥을 둥글게하는 것입니다. 디버깅을 통해 원하는 항목에 대해 원하는 값을 설정하는 것처럼 보입니다.

그러나 내가 가지고있는 문제는 모서리 반경이 모든 목록 항목에 대해 맨 아래 항목 인 것처럼 설정된다는 것입니다.

약간의 차이는 있지만 적어도 디버깅 목적으로 GradientDrawable의 코너 반경을 가져 오는 방법이 있습니까?

감사합니다,
WTS

+0

잘 모르겠 으면 반경이 알려진 버그가 있다는 것을 지적하고, 반올림하지 않으려는 모서리에는 항상 0 대신 0.1f를 사용해야합니다. http://code.google.com/p/android/issues/detail?id=939를 참조하십시오 -하지만 당신의 방법은 반대라고 생각합니다. 아마도 아마리스트 어댑터 로직과 관련이있을 것입니다. –

+0

모서리 반지름을 얻을 수 없다고 생각합니다. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android /graphics/drawable/GradientDrawable.java#GradientDrawable. 드로어 블을 xml로 정의하려고 시도 했습니까? –

+0

@Mathias : 기본 drawable은 xml이지만 첫 번째 항목과 마지막 항목 만 수정해야합니다. –

답변

16

setCornerRadii()를 호출하는 대신 mutate(). setCornerRadii()를 호출하면 문제를 해결할 수있다.()
이 거의 정확 (그 이유는 기본적으로 설명 않습니다 제공된 링크) Wonko에 의해) http://www.curious-creature.org/2009/05/02/drawable-mutations/에서 사용할 수

편집. 유일한 변경 사항은 mutate()가 setCornerRadii() 메서드가없는 Drawable을 반환한다는 것입니다. 대신 변형 된 객체를 다시 GradientDrawable에 캐스팅해야하며 매력처럼 작동합니다.

+0

좋은 대답, 좋은 링크.나는 당신의 대답에 하나의 변화를 만들었습니다. (저는 여전히 그것을 답으로 표시했습니다.) 그래서이 문제를 가진 사람은 앞으로 한 곳에서 정보를 얻을 수 있습니다. –

+0

lol - 링크가 자신 만의 것이라는 것을 깨달았습니다. 내가 할 수 있으면 그것을 두 번 upvote 것입니다. :) –

1

편집 : 그냥이가 OP의 문제에 대한 수정하지 않습니다 깨달았다.

background.setCornerRadius(1.0f); 
background.setCornerRadii(new float [] { topRadius, topRadius, 
             topRadius, topRadius, 
             bottomRadius, bottomRadius, 
             bottomRadius, bottomRadius}); 

이 문제가 해결되는지 알려주세요 :

는 마티아스의 의견뿐만 아니라,이에 대한 수정 프로그램은 먼저 1로 반경을 설정 각각의 코너 반경을 설정하는 것입니다. 멀리 모서리 반경을 얻는만큼, 나는 그렇게 할 방법을 모르겠다. ...

+0

아니요 - @Romain Guy (대답으로 표시)의 해결책과 이유를 확인하십시오. –

+0

그래,이 특별한 문제에 대한 해결책이 아니라는 Romain/your answer을 읽은 후 깨달았습니다. 미래에 알아야 할 좋은 물건들! :) – kcoppock