Jak ustawić kolor tła widoku


179

Próbuję ustawić kolor tła widoku (w tym przypadku przycisku).

Używam tego kodu:

// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

Powoduje to zniknięcie przycisku z ekranu. Co robię źle i jaki jest właściwy sposób zmiany koloru tła w dowolnym widoku?

Dzięki.


1
To wygląda dobrze. W rzeczywistości nie sądzę, abyś musiał wywoływać unieważnienie (). Kiedy mówisz, że przycisk znika, czy masz na myśli to dosłownie, czy też masz na myśli, że na przycisku był tekst lub obraz, który znika?
RickNotFred

Odpowiedzi:


281

Twój przycisk jest przezroczysty. Pierwszy bajt to alfa.

Próbować v.setBackgroundColor(0xFF00FF00);


2
Odpowiedź EddieB poniżej jest znacznie lepsza, ponieważ usuwa wszelkie obramowania itp., Takie jak podkreślenie tekstu w EditText
Molten Ice.

@aroth jest lepszy Color.Green? Jeśli chcę kolor złożony z argb? ... Twoja odpowiedź jest przestarzała
opublikuj

2
@delive - Przyjdź ponownie? Color.GREEN nie jest przestarzałe i zawiera bajt alfa. Jest to wartość 0xff00ff00, dokładnie tak samo jak to, co sugeruje odpowiedź, oprócz tego, że ma również taką zaletę, że czytelny dla człowieka . Większość programistów wolałaby rozwiązanie czytelne dla człowieka.
aroth

145

Kiedy wywołujesz setBackgoundColor, nadpisuje / usuwa wszelkie istniejące zasoby tła, w tym wszelkie obramowania, narożniki, wypełnienie itp. To, co chcesz zrobić, to zmienić kolor istniejącego zasobu tła ...

View v;
v.getBackground().setColorFilter(Color.parseColor("#00ff00"), PorterDuff.Mode.DARKEN);

Eksperymentuj z PorterDuff.Mode. *, Aby uzyskać różne efekty.


„nadpisuje / usuwa wszelkie istniejące zasoby w tle”, raczej nie.
Yousha Aleayoub

2
Musiałem użyć powyższego wraz z v.invalidate (); w następnym wierszu.
Hashim Akhtar

1
próbował stracić czas i poszedł z zaakceptowaną odpowiedzią, v.getBackground () dał wyjątek nullpointer i zawiesił się.
Siddarth G

To plus PorterDuff.Mode.SRC_IN rozwiązane za mnie, więc nie zgubiłem obramowania tła.
Guilherme Carvalho

123

Kilka opcji, aby to zrobić ...

Ustaw zielone tło:

v.setBackgroundColor(0x00FF00);

Ustaw zielone tło za pomocą Alpha :

v.setBackgroundColor(0xFF00FF00);

Ustaw tło na zielone za pomocą stałej Color.GREEN:

v.setBackgroundColor(Color.GREEN);

Ustaw tło na zielone, definiując je w Colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>     
    <color name="myGreen">#00FF00</color> 
    <color name="myGreenWithAlpha">#FF00FF00</color> 
</resources>

i używając:

v.setBackgroundResource(R.color.myGreen);

i:

v.setBackgroundResource(R.color.myGreenWithAlpha);

lub dłużej zdyszany:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreen));

i:

v.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.myGreenWithAlpha));

getResources().getColor(...)został wycofany stackoverflow.com/questions/31842983/…
Junior Mayhé,

5
Jest też: v.setBackgroundResource(R.color.myGreen);podczas używaniacolors.xml
ponury

Usunięto invalidatewywołania, jak widać, setBackground... metody już to wywołują.
weston

v.setBackgroundColor(0x00FF00);to tylko ich kod, o którym mówią, że nie działa. Spodziewałbym się również, że będzie przejrzysty.
weston

35

Możesz ustawić kolor szesnastkowy dla dowolnego zasobu za pomocą:

View.setBackgroundColor(Color.parseColor("#e7eecc"));

16
// set the background to green
v.setBackgroundColor(0x0000FF00 );
v.invalidate();

Kod nie ustawia przycisku na zielono. Zamiast tego sprawia, że ​​przycisk jest całkowicie niewidoczny.

Wyjaśnienie: wartość szesnastkowa koloru jest nieprawidłowa. Przy wartości alfa równej zero kolor będzie niewidoczny.

Prawidłowa wartość szesnastkowa jest 0xFF00FF00dla pełnego krycia w kolorze zielonym. Każda wartość alfa między 00 a FF spowodowałaby przezroczystość.


12

i jaki jest prawidłowy sposób zmiany koloru tła w dowolnym widoku?

Na jakimkolwiek View ? To, co masz, jest poprawne, ale powinieneś przerwać invalidate()połączenie.

Jednak niektórzy Viewsmają już tło. Na Buttonprzykład A ma już tło: przód samego przycisku. To tło to plik StateListDrawable, który można znaleźć w android-2.1/data/res/drawable/btn_default.xmlinstalacji Android SDK. To z kolei odnosi się do zbioru dziewięciopłatowych obrazów bitmapowych, dostępnych w wielu gęstościach. Będziesz musiał sklonować i zmodyfikować to wszystko, aby osiągnąć swoje zielone cele.

Krótko mówiąc, lepiej będzie znaleźć inny wzorzec interfejsu użytkownika, niż próbować zmienić tło pliku Button.


OK, dziękuję za wyjaśnienie dotyczące tła przycisków. Dziewięć łatek bitmapowych ( developer.android.com/reference/android/graphics/NinePatch.html ) było dla mnie nowych. Chcę po prostu zmienić kolor czegokolwiek na ekranie po naciśnięciu przycisku. Przyciski znajdują się w TextView. Próba zmiany koloru prowadzi do komunikatów konsoli „DDM dispatch reg wait timeout… ActivityManager: Can't send DDM chunk 52454151: no handler specified” oraz okno dialogowe na ekranie „aplikacja zatrzymała się nieoczekiwanie”. Chyba muszę przeczytać więcej na temat interfejsu użytkownika. Wszelkie podpowiedzi mile widziane. Dzięki.
Peter vdL

12

Aby ustawić pierwszy kolor, który będzie widoczny na ekranie, możesz to również zrobić w odpowiednim pliku layout.xml (lepszy projekt), dodając tę ​​właściwość do odpowiedniego widoku:

android:background="#FF00FF00"

Pytanie wyjaśnia, że ​​zmiana koloru musi być dynamiczna.
Peter vdL





4

To pytanie dotyczy zmiany koloru tła widoku. W jednej z odpowiedzi osoba wyjaśnia, jak zmienić kolor tła w czasie działania. Oczywiście zamierzasz przyjrzeć się, jak modyfikować inne obiekty na ekranie, ale powinno to dać ci dobry początek, przynajmniej umożliwiając modyfikowanie koloru tła widoku po kliknięciu przycisku.


3

W przypadku systemu Android 6 użyj ContextCompact

        view.setBackgroundColor( ContextCompat.getColor(this, R.color.your_color));


2

W Kotlinie można to zrobić tak:

val backgroundColor = R.color.whatever_color_you_like
view.setBackgroundColor(getColorCompat(backgroundColor))

Gdzie getColorCompat()jest funkcja rozszerzenia:

/**
 * Extension method to provide simpler access to {@link ContextCompat#getColor(int)}.
 */

 fun Context.getColorCompat(color: Int) = ContextCompat.getColor(this, color)

1
view.setBackgroundColor(R.color.primaryColor);

Dodaje kolor do poprzedniej wartości koloru, więc mam inny kolor.

U mnie działa:

view.setBackgroundResource(R.color.primaryColor);

1

Załóżmy, że mamy kolor podstawowy w values=>colors.xmlpostaci:

<resources>
    <color name="primary">#FDD835</color>
</resources>

więc jeśli chcemy użyć naszego niestandardowego koloru setBackgroundColor(@ColorInt int Color), potrzebujemy tylko adnotacji @SuppressLint("ResourceAsColor")z konstruktorem / metodą, która zostanie użyta jako:

    @SuppressLint("ResourceAsColor")
    public _LinearLayout(Context context) {
        super(context);

        // Formatting our layout : )
        super.setBackgroundColor(R.color.primary);

        ....


    }

0

Musisz przekazać intargument.

Pierwszy przykład:

view.setBackgroundColor(-500136)

Drugi przykład:

int colorId = R.color.green;

view.setBackgroundResource(colorId);


0

Wypróbowałem wszystkie powyższe sposoby. Ale nie udało mi się osiągnąć tego, czego potrzebuję. Oto moja próba. Jeśli używasz kodu szesnastkowego dla koloru i chcesz ustawić kolor jako tło obrazu, to jest to kod kotlin.

val bitmap = Bitmap.createBitmap(30, 30, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
val colorCode = "#ffffff"
canvas.drawColor(Color.parseColor(colorCode))
mImageViewLogo.setImageBitmap(bitmap)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.