Editing XML Style Sheets Changes Buttons in Android - java

I'm working on an Android app and decided I wanted to change the colors across the whole app, so I used an xml style sheet. This changed my colors, but it didn't change my EditText, TextView, and Button colors, so I had to make an individual style sheet for each element and then call those sheets from within the main color sheet I was using.
However, once I did that, the colors acted appropriately for the three widgets, but the boxes shrunk and disrupted our entire layout. We believe it's because we had overridden the default styles for those, but I thought the way it was written, we were merely overriding the color options.
I'd like to figure out how to change the colors of EditText, TextView, and Button, but not change their formatting.
The Styles.xml for our project:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<color name="oldblue">#33b5e5</color>
<color name="gungrey">#9C9C9C</color>
<color name="textGold">#ffe27e</color>
<color name="backgroundBlack">#000000</color>
<color name="buttonGrey">#222222</color>
<!--
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
<style name="AppBaseTheme" parent="android:Theme.Light">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
backward-compatibility can go here.
-->
</style>
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
<item name="android:textColor">#color/textGold</item>
<item name="android:windowBackground">#color/backgroundBlack</item>
<item name="android:colorBackground">#color/backgroundBlack</item>
<item name="android:editTextStyle">#style/TextEditStyle</item>
<item name="android:textViewStyle">#style/TextViewStyle</item>
<item name="android:buttonStyle">#style/OurButtonStyle</item>
</style>
<!-- Allows us to edit the EditText field -->
<style name="TextEditStyle" parent="android:Widget.EditText">
<item name="android:background">#e3e3e3</item>
</style>
<!-- Allows us to edit the TextView words (much of the app text) -->
<style name="TextViewStyle" parent="android:Widget.TextView">
<item name="android:textColor">#color/textGold</item>
</style>
<!-- Allows us to edit the Buttons in the app -->
<style name="OurButtonStyle" parent="android:Widget.Button">
<item name="android:textColor">#color/textGold</item>
<item name="android:background">#color/buttonGrey</item>
<item name="android:padding">10dp</item>
<!-- This line here helped us fix the issue with the buttons colliding with the textboxes, but ideally, we want to change a single thing and fix all the widgets and not have to use padding here -->
</style>
</resources>
Our app is using Linear Layout on all of our pages. We would like to keep it this way if possible.
Please let me know if you need to see any screenshots or xml code of the individual pages. They're all having the same error, though.
Thanks for any help you can give!

Instead of android:, try prefacing your parent references with #android:style/.

When you're modifying the background attribute for aButton or EditText, you're replacing the entire background that already exists which is why you're losing all the "formatting".
So with a Button, the default buttons you see are actual images.
For example, btn_default_normal_holo.9.png located in (path-to-sdk)\platforms\android-19\data\res\drawable-xhdpi
One way is to create 9 patch images to create your background. You can refer to the answer by Basim Sherif here. In that question, it asks a similar question to yours. So in this case you can use the existing images and modify the colors.
Otherwise, you will need to set your own styles (drawables and selectors) to "match" the original formatting or using your own formatting.
Also note that since you set the background of your buttons to a color, there aren't any selectors anymore (like changing the color when the button is selected).

Related

Best practice to place menu Icons on the left side of the navigation drawer in Persian,Hebrew devices?

I am trying to have a navigation drawer that opens from the right. ( i managed to do that using LAYOUT_GRAVITY="END").
Now I want all the menu items to start from the right and also their Icons on the right too.
To do that I added (SUPPORTSRTL="TRUE") to the manifest and that also solved the problem. But here is the problem:
if the device's language is set to English, everything works perfectly.
But if the device's language is set to Persian(which is a RTL language) then everything else in the app will be right to left. That means what ever I put in the right goes to left and what ever that is set to the left goes to the right. I even tried using "start" and "end" instead of "right" and "left" but that didn't solve the problem.
To solve that I had to set the (LAYOUTDIRECTION="LTR") to the root element of layouts on every one of my actitives. That solved the problem and now everything is in the position I desired, however this doesn't seem like a sustainable solution to add this line of code to root element of each activity I will ever add to my app.
Can you please tell me if this is the best way to do it or not?
I found other questions with the same topic with no accepted proper answers.
this line of code should solve your problem
ViewCompat.setLayoutDirection(drawer, ViewCompat.LAYOUT_DIRECTION_RTL);
drawer is a reference to your DrawerLayout.
an other way to force RTL layout to activities is using styles xml. this is how i whould do it:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
</style>
<style name="ShaliRTL" parent="AppTheme">
<item name="android:layoutDirection">rtl</item>
</style>
</resources>
then in android manifest apply this new style (ShaliRTL) to your specific activity:
<activity
android:name=".YourActivity"
android:label="#string/title_activity_settings"
android:theme="#style/ShaliRTL"
android:screenOrientation="fullSensor" />
good luck.

How would I dynamically change the font color for a whole android app?

I have my styles.xml file for the app:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
<item name="android:textColor">#000000</item>
<item name="android:background">#FFFFFF</item>
</style>
I want to make it so that if a user selects a value from a spinner then that value changes the textColor in the styles app.
I have my onClick method and I have the value from the spinner but I can't figure out how I access the textColor styles item and how I dynamically change it?
I didn't manage to do exactly what I wanted but a workaround was that I only let the user choose between 3 font colours: black, blue, and red, and then I had 3 themes. Each theme had the different text colour.
Then I just switched the theme following this answer: Android - Change app Theme on onClick
One way to achieve this is to make a color.xml resource in the rescourses folder and link to it in the activity layout.
Also why do you have css as one of the tags for this question?
Rather it should be XML.

Define multiple textColor in one theme

Currently I'm trying to define in my application a theme for day mode and another for night mode.
I can already change between those two, the problem is that I have textViews with white text color and others with black text color. So I would like to know if there is a way for:
Define multiple textColors in one theme;
OR
Define themes that change the style, e.g.
// defined in the layout
<TextView style="#style/whiteStyleText" />
<TextView style="#style/blackStyleText" />
// defined in the styles
<style name="Theme.DayTheme" parent="#style/Theme.ActivityTheme">
<item name="#style/whiteStyleText">#color/white</item>
<item name="#style/blackStyleText">#color/black</item>
</style>
<style name="Theme.NightTheme" parent="#style/Theme.ActivityTheme">
<item name="#style/whiteStyleText">#color/light_red</item>
<item name="#style/blackStyleText">#color/red</item>
</style>
Many thanks in advance.
this might help you a bit. Not a 100% sure what you want.
It is to define all your colors in one place. Place this is res>values>styles.xml
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
</style>
<style name="AppTheme" parent="AppBaseTheme">
</style>
<color name="blueDefault">#2782AF</color>
<color name="blueBGDark">#226A87</color>
<color name="blueDark">#257493</color>
<color name="blueLight">#297F99</color>
<color name="greyDefault">#3F4144</color>
</resources>
I haven't found anything about multiple textColors defined in the same theme.
One solution, which I've done is, set a default textColor for the dayTheme and another one for the nightTheme.
For all other textViews that does not use that default color, I've defined it in the layout, and at the beginning of the activity I check what is selected, day or night mode and I call setContentView with the proper layout.
Another solution would be, declare a custom attribute, e.g. textColorNight, and create a custom textView which would use this attribute and then would check what mode is currently selected, so it could decide if the textColor (day mode) or the textColorNight (night mode) would be applied to it's text.
I thing this second solution is a more refined one, but I haven't implemented it because of the lack of time. But next time I need to implement the day/night mode, I'll do it this way.

Changing actionBar dropdown background color

How do i change the color of the background where it says "add contact" and "about". Now its kind of grayish, but i want it to be white! This is a actionBar with dropdown, not a spinner. And im not using that actionbarsherlock thing.
For example, in you exisiting parent Style definition, add just the android:popupMenuStyle attribute as shown below:
<style name="Theme.Example" parent="#android:style/Theme.Holo.Light">
<item name="android:popupMenuStyle">#style/PopupMenu.Example</item>
.......
.......
</style>
And override the android:popupMenuStyle attribute by defining your style:
<style name="PopupMenu.Example" parent="#android:style/Widget.Holo.Light.ListPopupWindow">
<item name="android:popupBackground">#drawable/menu_dropdown_panel_example</item>
</style>
The #drawable/menu_dropdown_panel_example is this:
You can either choose to use an image similar to the one above, or use an Color resource.
And this is for the default ActionBar. Not the ActionBarSherlock. ;-)
ActionBar styles can be easily created using this cool website: http://jgilfelt.github.com/android-actionbarstylegenerator/. I usually experiment a little here before deciding on the style. Plus, it lets you download the styles and all necessary resources. Just plug them in your app and you are good to go. :-)
UPDATED: I think I caused some confusion which has resulted in the loss of the shadow on your app's drop-down. You may have replaced all the <items> in your Style that I listed in the original suggestion. The edit should fix that.
UPDATE 2:
Use these image resources instead of the #android:color/white value you are currently using. These are in the order of XHDPI, HDPI and MDPI. Save them and use them in the Style definition.
Try to get styles from ActionBarStyleGenerator service. It has preview and makes all necessary drawable, xml and styles.
There you can easily find and change required color and then find it in sources (in your case it is android:popupBackground).
You can simple override itemBackground item in your theme:
<style name="AppTheme" parent="Theme.AppCompat.Light">
<item name="android:itemBackground">#color/skyBlue</item>
</style>

ActionSherlockBar Styling - PopupMenu

Styling is a place for improvement in my knowledge of the android platform. Given I've being trying to make a simple change all morning and been unable to achieve it.
I want to change the style of the overflow menu in the action bar. I have been able to change the background color, and add animations, so that when clicked it fades to a selected colour. But for the life of me I cannot change the text colour.
Below are two screenshots, one using the Theme.Sherlock and the other using Theme.Sherlock.Light.
Theme.Sherlock - This is my current setting which I have customised. What I want is the overflow (aka android:popupmenu) to be in the holo theme (as below), and ideally so that I can change the text colour.
Theme.Sherlock.Light - This theme shows the style of overflow menu that I want to see. However, as highlighted in red, the overflow button is the wrong colour, and this theme also draws a horizontal line.
I don't know whether it is best/easier to change Theme.Sherlock with the popup issue, or Theme.Sherlock.Light with the overflow icon and line issue. The application is of a "Light" theme so option two is probably the long term better choice, however i'll accept an answer that can solve the problem by changing either theme.
p.s. Where do you find a list of attributes for changing theme/styles, auto-complete is very incomplete in eclipse.
Update
This is actually an update for native action bars as im back to the same problem, but no longer supporting 2.3 or below.
<style name="AppTheme" parent="android:Theme.Holo.Light">
<item name="android:actionOverflowButtonStyle">#style/OverFlow</item>
</style>
<style name="OverFlow" parent="#android:style/Widget.Holo.ActionButton.Overflow">
<item name="android:src">**Insert your icon here**</item>
</style>
This answer is probably coming too late, but to those who may stumble across this question. I find it interesting that you were able to change the overflow's background color. I found that extremely difficult to figure out whereas changing the text was pretty straight forward. Just override the android:itemTextAppearance value in your custom theme.
<item name="android:itemTextAppearance">#style/your_new_text_appearance</item>
<style name="your_new_text_appearance">
<item name="android:textColor">#color/red</item>
</style>
I'm not familiar with ActionBarSherlock, but you can find the standard OverFlow icons on your harddisk in the folder
path\to\android\android-sdk\platforms\android-api-level\data\res\drawable-resolution
and they are called ic_menu_moreoverflow_normal_holo_dark.pngand ic_menu_moreoverflow_normal_holo_light.png
Alternatively you can find them online here.
I believe that the left circle is a drawable, too. Look inside the res\drawable.
Simple do the following:
1. In the theme.xml in your app theme style add this item:
<item name="popupMenuStyle">#style/PopupMenu</item>
2. In styles.xml add this new style:
<style name="PopupMenu" parent="#style/Widget.Sherlock.Light.ListPopupWindow">
<item name="android:textSize">14sp</item>
</style>
In the style you may override text size or other parameters as you want.
Try to override style of Theme.Sherlock with help of Android Action Bar Style Generator

Categories

Resources