change background color of Preference

AndroidAndroid Emulator

Android Problem Overview


I have a PreferenceCategory, xml file and I have defined all preferences in it, I call this from class that extends PreferenceActivity. I am unable to set the background of my settings screen, this screen is displayed with help of xml file shown below. Please see that I have already defined the android:background="#041A37", still the screen remains default color: black.

public class MyPreferenceActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Context mContext=super.getBaseContext();
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.layout.preference);
        //v.setBackgroundColor(Color.rgb(4, 26, 55));
    }
}

preference.xml is

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#041A37" >

    <PreferenceCategory>
        <com.dropcall.SeekBarPreference
            android:background="#041A37"
            android:defaultValue="5"
            android:key="@string/Interference_Delay"
            android:progressDrawable="@drawable/seekbardrawable"
            android:title="Seconds Delay until intereference" />

        <com.dropcall.SeekBarPreference2
            android:defaultValue="30"
            android:key="@string/Drop_Delay"
            android:progressDrawable="@drawable/seekbardrawable"
            android:title="Seconds delay until drop" />

        <CheckBoxPreference
            android:background="@drawable/state_normal"
            android:defaultValue="true"
            android:key="@string/Drop_Option"
            android:title="Close after call drop" />
        <CheckBoxPreference
            android:background="@drawable/state_normal"
            android:defaultValue="true"
            android:key="@string/Timer_Option"
            android:title="Start timers on launch" />
    </PreferenceCategory>

</PreferenceScreen>

Although I have set android:background="#041A37" in every file, the background doesn't turn into navy blue, or any other color for that matter. It remains default color, black. How to change the background color. Please let me know any pointers / hints , if you had faced same issue let me know what changes you made to set the background color.

Android Solutions


Solution 1 - Android

You can define a theme and then set this for your PreferenceActivity in the manifest. Your theme can then define a a background color or a windowBackground image should you prefer that.

Manifest:

	<activity android:label="@string/app_label" android:name=".client.PreferencesActivity"
		android:theme="@style/PreferencesTheme">
        <intent-filter>                                
        </intent-filter>
    </activity>

Then add the theme to your styles.xml

<style name="PreferencesTheme">
	<item name="android:windowBackground">@drawable/background_image</item>
    <item name="android:background">#FFEAEAEA</item>
</style>

In the above snippet there's both a background color and a background image defined to show how to do it.

Solution 2 - Android

This worked for me

getListView().setBackgroundColor(Color.TRANSPARENT);

getListView().setCacheColorHint(Color.TRANSPARENT);

getListView().setBackgroundColor(Color.rgb(4, 26, 55));

Solution 3 - Android

Another work-around as far as color goes is that you create a theme for the preferences activity and put the background color of list views as well:

<style name="PrefsTheme" parent="@android:style/Theme.Black.NoTitleBar">
	<item name="android:windowBackground">@color/prefs_bg</item>
	<item name="android:textColor">@color/text_color</item>
	<item name="android:listViewStyle">@style/listViewPrefs</item>
</style>

<style name="listViewPrefs" parent="@android:style/Widget.ListView">
	<item name="android:background">@color/prefs_bg</item>
	<item name="android:cacheColorHint">@color/prefs_bg</item>
</style>

Solution 4 - Android

android:background is not an available attribute, according to the documentation.

It is possible you could theme the PreferenceActivity to achieve your color change, though I have not tried this, because I want my preferences to look like those of the rest of Android, to improve usability of the app.

Solution 5 - Android

Or you can also make drawable as your background:

>
> getListView().setBackgroundDrawable(getResources().getDrawable(R.drawable.bluegradient));

Note: setBackgroundDrawable() is deprecated. Use setBackground() instead.

> getListView().setBackground(getResources().getDrawable(R.drawable.bluegradient));

Solution 6 - Android

I faced with the same requirement (Androidx Preference Screen background for settings fragment).

The below code has worked for me in a fragment. (in themes.xml). I assume that it is gonna work also for an activity.

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        ...............
       <!-- Add below -->
        <item name="preferenceTheme">@style/preference</item>
    </style>
    
    <style name="preference" parent="Theme.AppCompat">
        <item name="android:background">@color/purple_200</item>
    </style>
</resources>

Solution 7 - Android

Please specify a linear layout with a textview attached and specify background color and attach this xml to preferencecategory using the layout property.

<PreferenceCategory
     android:layout="@layout/preftitle"
 >

Where preftitle is an xml which has a linear layout and text view attached.

Solution 8 - Android

Go to res>values>styles.xml> and add this code to your <style > </style> the style should must be app base theme in this @color/activ is color resources added to colors.

<style name="app_theme" parent="@android:style/Theme">
    <item name="android:windowBackground">@color/activ</item>
    <item name="android:windowContentOverlay">@drawable/title_bar_shadow</item>
    <item name="android:listViewStyle">@style/TransparentListView</item>
</style>

if you use app_theme name of style tag then add like this to your manifest

<application
    android:name=".XXXXXX"
    android:allowBackup="true"
    
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/app_theme" > //here
 

If you only want to change your background

Solution 9 - Android

I am using the PreferenceFragmentCompat, the below solution worked for me.

SettingsScreen

import android.os.Bundle
import android.util.TypedValue
import android.view.View
import androidx.annotation.ColorInt
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import com.almarai.easypick.R


class SettingsScreen : PreferenceFragmentCompat(), 
Preference.OnPreferenceChangeListener {

override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {

//Providing the XML file for the view to be created
setPreferencesFromResource(R.xml.app_settings_preferences, rootKey)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

//Get the Theme specific color
val typedValue = TypedValue()
val theme = requireContext().theme

/*R.attr.colorBackgroundScreenBody is my own attr from attrs.xml file, 
you can directly use R.color.red - Or any color from your colors.xml 
file if you do not have multi-theme app.*/
theme.resolveAttribute(R.attr.colorBackgroundScreenBody, typedValue, true)
@ColorInt val color = typedValue.data

view.setBackgroundColor(color)

super.onViewCreated(view, savedInstanceState)
}
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavid PrunView Question on Stackoverflow
Solution 1 - AndroidAndreasWView Answer on Stackoverflow
Solution 2 - AndroidDavid PrunView Answer on Stackoverflow
Solution 3 - AndroidSileriaView Answer on Stackoverflow
Solution 4 - AndroidCommonsWareView Answer on Stackoverflow
Solution 5 - AndroidRootkoView Answer on Stackoverflow
Solution 6 - Androiduser8260998View Answer on Stackoverflow
Solution 7 - AndroidmadhaviView Answer on Stackoverflow
Solution 8 - AndroidAvinash Ajay PandeyView Answer on Stackoverflow
Solution 9 - AndroidMohammed UzairView Answer on Stackoverflow