2016-07-22 20 views
-1

Ich bin auf ein Problem gestoßen, das ich keine Lösung finden kann. Ich habe einen Kreislayout, den ich als Hintergrund eine zufällige Farbe einstelle. Das Problem ist, das Layout ist quadratisch statt einer Kreisform. Hier ist mein Code:Kreislayout wird quadratisch, wenn ich den Hintergrund programmatisch setze

Die ovale Form in res/ziehbar

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval"> 
<size 
    android:width="@dimen/avatar_height" 
    android:height="@dimen/avatar_height" /> 
</shape> 

die Anordnung von Farben, die in ziehbar/Werte/Farben sitzt

<integer-array name="avatar_colors"> 
    <item>@color/avatar_1</item> 
    <item>@color/avatar_2</item> 
    <item>@color/avatar_3</item> 
    <item>@color/avatar_4</item> 

</integer-array> 

Das ist mein Kreis Layout

<RelativeLayout 
         android:id="@+id/letter_avatar" 
         android:layout_width="@dimen/avatar_height" 
         android:layout_height="@dimen/avatar_height" 
         android:background="@drawable/avatar"> 

         <TextView 
          android:layout_width="wrap_content" 
          android:layout_height="wrap_content" 
          android:textSize="@dimen/textsize_splash_screen" 
          android:textColor="@color/jwhite" 
          android:layout_marginBottom="@dimen/gap_small" 
          android:text="A" 
          android:layout_centerInParent="true"/> 
        </RelativeLayout> 

und so stelle ich die zufällige Farbe als Hintergrund ein

mLetterAvatar = (RelativeLayout) findViewById(R.id.letter_avatar); 

    int[] androidColors = getResources().getIntArray(R.array.avatar_colors); 
     int randomAndroidColor = androidColors[new Random().nextInt(androidColors.length)]; 
     mLetterAvatar.setBackgroundColor(randomAndroidColor); 

Und das ist das Ergebnis, das ich bin

enter image description here

Hinweis bekommen: Wenn ich den Hintergrund nicht programmatisch das Layout eine Kreisform hat festgelegt (siehe Screenshot unten)

Wie bekomme ich das Kreislayout und habe die Möglichkeit, eine Farbe programmatisch als Hintergrund hinzuzufügen? Vielen Dank.

+0

Der Hintergrund, den Sie in Ihrem Zeichenfeld festlegen, ist eine kreisförmige Form, der Hintergrund, den Sie in Ihrem Code festlegen, ist kein kreisförmiges Zeichen. Wenn Sie die Farbe ändern möchten, sollten Sie einen Farbton verwenden oder zu einem Zeichen mit einer anderen Farbe wechseln. – Ramin

Antwort

1

Das Problem ist, dass Sie Ihren ziehbar Hintergrund mit einem einfachen Farb mit dieser Linie ersetzen:

mLetterAvatar.setBackgroundColor(randomAndroidColor); 

Also, wenn Sie stattdessen den Kreis Farbe ändern möchten, können Sie eine andere Form mit einer anderen Farbe haben sollte, oder holen Sie sich das Zeichen aus dem Code und setzen Sie die Farbe wie folgt beschreibt link

0

Wie ich sehe, platzieren Sie avatar.xml als Hintergrund in XML und avatar_color.xml [mit Zufallsindex] in Code.

+0

ja. Dies ist, was ich getan habe –

+0

'setBackgroundColor' überschreibt Setted in Xml, so dass Sie nicht ShapeDrawable, sondern ColorDrawable haben, also haben Sie quadratischen Hintergrund, aber nicht Kreis. –

0

So nach einem anstrengenden Wochenende, ich habe es geschafft, eine Lösung basierend auf Jonathan Aste Antwort zu finden. Ich weiß nicht, ob dies der sauberste Weg ist, aber hier geht es:

in Res/Drawable Ich habe 4 verschiedene Formen mit verschiedenen Hintergrundfarben erstellt.

<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval"> 

<solid android:color="#ffcc00"/> 
<size 
    android:width="@dimen/avatar_height" 
    android:height="@dimen/avatar_height" /> 

Danach habe ich dieses Array in res/Werte/arrays.xml erstellt.

<array name="random_avatar_array"> 
    <item>@drawable/avatar_green</item> 
    <item>@drawable/avatar_yellow</item> 
    <item>@drawable/avatar_red</item> 
    <item>@drawable/avatar_blue</item> 
</array> 

und in Code ist das, was ich

 if (view.getBackground() == null) { 
     TypedArray avatars = getResources().obtainTypedArray(R.array.random_avatar_array); 
     Drawable drawable = avatars.getDrawable(new Random().nextInt(avatars.length())); 
     view.setBackground(drawable); 
    } 

Hoffe, es hilft jemand getan haben.