2010-12-03 4 views
1

私はExpandableListAdapter.getChildViewで問題をデバッグしようとしています。Android GradientDrawable - Corner Radiiの問題

私は、リストアイテムのバックグラウンドに対してグラデーションと半径が1のコーナーを含むシェイプを持つDrawableを定義しました。

その後、私のアダプタのコードで、私は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.1Fの代わりに0を使用する必要があり、半径既知のバグがあることを指摘したいと思います。 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でdrawableを定義しようとしましたか?違いがあるかどうかを確認するだけですか? –

+0

@Mathias:基本ドロアブルはxmlですが、最初と最後の項目(唯一)を変更する必要があります。 –

答えて

16

setCornerRadii()を呼び出す代わりに、問題を解決する必要があるmutate()。setCornerRadii()を呼び出します。 )http://www.curious-creature.org/2009/05/02/drawable-mutations/で利用可能

編集(Wonkoによる)
)これは、ほぼ正確である(と提供されるリンクは基本的に理由を説明しません。唯一の変更は、mutate()がsetCornerRadii()メソッドを持たないDrawableを返すことです。その代わりに、変形したオブジェクトをGradientDrawableにキャストする必要があり、それは魅力のように機能します。これはあなたに関連している場合

((GradientDrawable) background.mutate()).setCornerRadii(
    new float [] { topRadius, topRadius, topRadius, topRadius, 
        bottomRadius, bottomRadius, bottomRadius, bottomRadius}); 
+0

良い答え、素晴らしいリンク。私はあなたの答えに1つの変更を加えました(私はそれをまだ答えとしてマークしていました)ので、将来この問題を抱える人は誰でも1つの場所に情報を持っています。 –

+0

笑 - ちょうどあなた自身のリンクであることを理解しました。私ができるならそれを2倍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 /あなたの答えを読んだ後で私はこの特定の問題の解決策ではなかったことを認識しました。将来的に知るべき良いもの! :) – kcoppock