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.

Peter vdL
źródło
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);

rainhut
źródło
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.

EddieB
źródło
„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));
Jorgesys
źródło
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"));
Vipul Patel
źródło
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ść.

malte kosian
źródło
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.

CommonsWare
źródło
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"
JustinB
źródło
Pytanie wyjaśnia, że ​​zmiana koloru musi być dynamiczna.
Peter vdL
11

spróbuj dodać:

setBackgroundColor(Color.parseColor("#FF0000"));
Długa tęcza
źródło
6

Używam przy API min 16, cel 23

Button WeekDoneButton = (Button) viewWeeklyTimetable.findViewById(R.id.week_done_button);

WeekDoneButton.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.colorAccent));
Vostro
źródło
Zwykle nie ma wielu domyślnych kolorów. Nowe kolory można zdefiniować w res / values ​​/ colors, jak opisano tutaj developer.android.com/samples/BasicMediaRouter/res/values/ ...
Krystian
5

Możesz w prosty sposób użyć:

view.setBackgroundColor(Color.parseColor("#FFFFFF"));
daniel kilinskas
źródło
5
mButton.setBackgroundColor(getResources().getColor(R.color.myColor));
Gianluca Demarinis
źródło
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.

jbranchaud
źródło
3

W przypadku systemu Android 6 użyj ContextCompact

        view.setBackgroundColor( ContextCompat.getColor(this, R.color.your_color));
Raluca Lucaci
źródło
2

Możesz w prosty sposób użyć:

view.setBackgroundColor(Color.rgb(0, 198, 255));
Szabla Mahmuda Salaha Eldiena
źródło
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)
Programista Androida
źródło
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);
meralon
źródło
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);

        ....


    }
ForWebTech
źródło
0

Musisz przekazać intargument.

Pierwszy przykład:

view.setBackgroundColor(-500136)

Drugi przykład:

int colorId = R.color.green;

view.setBackgroundResource(colorId);
David Mutenda
źródło
0

To powinno działać dobrze: v.setBackgroundColor(0xFF00FF00);

nishanuw
źródło
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)
Shaffz
źródło