ActionBarCompat, supportRequestWindowFeature(Window.FEATURE_NO_TITLE) and expected behavior - android

I'm uncertain of the expected behavior when using ActionBarCompat and supportRequestWindowFeature(Window.FEATURE_NO_TITLE). I see two different behaviors depending on Android version:
On a Android ICS (possibly also from Android 3.0?) device using ActionBarCompat a call to supportRequestWindowFeature(Window.FEATURE_NO_TITLE) would hide the combined titlebar/actionbar
On a Android 2.3 device the actionbar is still visible even though supportRequestWindowFeature(Window.FEATURE_NO_TITLE) is called.
Some additional information: My activities extend android.support.v7.app.ActionBarActivity and my app uses the #style/Theme.AppCompat.Light theme. supportRequestWindowFeature(Window.FEATURE_NO_TITLE) is called before setContentView(). I never make any call to either getSupportActionBar().show() or hide().
So, what's the expected behavior? When I used ABS a call to requestWindowFeature(Window.FEATURE_NO_TITLE) would hide the titlebar/actionbar regardless of Android version.
How would I go about having an android app where some activies use an actionbar while others have none? Should they not extend the same base class?

So I've found a solution to this but it uses styles applied via the AndroidManifest (and therefore needs no code). Keep in mind that this will almost definitely only work if you're using the AppCompat library.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="..."
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="19" />
<application
android:allowBackup="false"
android:icon="#drawable/launcher"
android:label="#string/app_name"
android:theme="#style/Theme.AppCompat.Light.DarkActionBar">
<activity
android:label="#string/log_in"
android:name=".activities.LogInActivity"
android:parentActivityName=".activities.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
<activity
android:label="#string/app_name"
android:name=".activities.MainActivity"
android:theme="#style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="#string/sign_up"
android:name=".activities.SignUpActivity"
android:parentActivityName=".activities.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.MainActivity" />
</activity>
</application>
</manifest>
Note how I've got a global theme applied directory to the <application> tag, and then also a theme that's individually applied to my MainActivity class through its own <activity> tag. That is the only Activity where I want the Action Bar to be hidden; everywhere else I want it to be visible (which is why I don't have individual themes applied to any of my other Activities as I instead let them inherit from the global application theme).
But you'll quickly find that Theme.AppCompat.Light.NoActionBar doesn't actually exist. This is because I had to create that style myself, which requires two different styles.xml files:
values/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.AppCompat.Light.NoActionBar" parent="Theme.AppCompat.Light">
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
values-v11/styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.AppCompat.Light.NoActionBar" parent="Theme.AppCompat.Light">
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
You must use two different styles.xml files for this as the android:windowActionBar flag didn't exist before Android API version 11.

Related

AndroidManifest - Set theme for activity

I am really frustrated right now and read a ton - maybe you can help me out.
Why is Android Studio still showing me "Main2Activity" with the titlebar?
Here is my Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.martin.myapplication">
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:roundIcon="#mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".Main2Activity"
android:theme="#android:style/Theme.Light.NoTitleBar"></activity>
</application>
I know it is really a small issue but I am unable to figure it out...
Sources I used:
https://developer.android.com/guide/topics/ui/look-and-feel/themes.html
Android theme not being set
Apply a theme to an activity in Android?
EDIT
Current State:
enter image description here
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
Is working but disables the ActionBar for every Activity!
Goal: activity_main2 should not have an ActionBar.
SOLVED It is just a bug from Android Studio. In the Preview it won't disable the AppBar but as soon as you play the App on your phones it works!
To Hide the Action Bar add the below code in Values/Styles
<style name="CustomActivityThemeNoTitle" parent="#android:style/Theme.Light">
<item name="android:windowNoTitle">true</item>
</style>
Then in your AndroidManifest.xml file add the below code in the required activity:
<activity android:name=".Main2Activity"
android:theme="#style/CustomActivityThemeNoTitle"></activity>
Alternatively, you can call this.requestWindowFeature(Window.FEATURE_NO_TITLE); in the onCreate method for your activity. For example:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_signup);
...
}
Try this
<style name="generalnotitle" parent="general">
<item name="android:windowNoTitle">true</item>
</style>

Android Studio: Remove default header

I am just beginning to learn Android Studio (version 2.0, running on Windows 7). When I create a new project (Empty Activity template) Android Studio places a header at the top of the project. How can I remove the header?
Here's a picture of the problem. I want to get rid of the 'My Greeting Card' header.
You have to simply navigate like below....
app -> res -> values -> styles.xml
Find <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> line.
Theme.AppCompat.Light.DarkActionBar line shows, how your activity will look like.
There are lots of Themes available. Just remove DarkActionBar it and press Cntrl+Space to explore another themes. In your case, you do not want Header which is called ActionBar in Android Terminology.
So, Just change theme to Theme.AppCompat.Light.NoActionBar and you are done.
To get more deeply about how the theming work and other courses of Android, Just try Pluralsight. Go to below link and get 6 months free subscription. It is very good website to learn any technology.
Pluralsight 6 Months Subscription
Well the answer is already given, but still i would like to add if you don't want any kind of actionbar on top of the activity simply do this.
go to your res->values->styles.xml and add these xml code
<resources>
<!-- Base application theme. -->
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#3F51B5</item>
<!-- Light Indigo -->
<item name="colorPrimaryDark">#3949AB</item>
<!-- Dark Indigo -->
<item name="colorAccent">#00B0FF</item>
<!-- Blue -->
</style>
<style name="AppTheme" parent="AppTheme.Base"></style>
</resources>
and reference the theme in the style on any activity you want, like below in the manifest using android:theme=#style/AppTheme.
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme">
<activity
android:name=".MainActivity"
android:label="#string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
</application>
you can hide Toolbar using
getActionBar().hide();
or
getSupportActionBar().hide();
For Newer Version
app -> res -> values -> themes -> themes.xml
In that it also depends whether the phone is in night mode or not.
Then You have to modify both the files:
themes.xml
themes.xml (night)
with
parent="Theme.MaterialComponents.DayNight.NoActionBar"
just Remove AppCompatActivity and extend it with only Activity

How can I achieve this theme with AppCompat?

I am trying to create this theme for one, and just one of my activities:
Since I am learning how this styles work, and I am now beginning to be aware that we have more different & incompatible ways of styling in android than atoms in the whole universe. So I've tried to learn from this site: http://jgilfelt.github.io/android-actionbarstylegenerator
However when I try to apply its theme in my project that is using AppCompat I get the
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
error type.
I am extending from ActionBarActivity in my tabbed activity and I don't feel safe going back now (someone suggested extending Activity to solve this issue), since in previous posts I was suggested to use AppCompat, and ActionBarActivity seems somehow to be AppCompat related.
I've spent all my week googling for solutions and I've came across these problems:
The official Android styling documentation is deprecated.
The code generated by Android Studio is also deprecated in method such as this.*
http://jgilfelt.github.io/android-actionbarstylegenerator is deprecated.
BUT, to the point now, this is what I have at the moment:
So, the only thing I am not being able to do is
putting the logo in the top left corner of the screen (in the action bar), in a way that only affects the action bar of this particular activity, (Done)
make the orange bar showing which tab is selected.
How can I achieve this in the most simple way?
This is my values/style.xml file:
<resources>
<!-- Base application theme. -->
<style name="SmartCampusTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">#color/actionbar_bg_color</item>
</style>
<style name="GenericProgressIndicator" parent="#android:style/Widget.ProgressBar.Small">
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:indeterminate">true</item>
</style>
</resources>
My AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="greensmartcampus.eu.smartcampususerfeedbackapp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:logo="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/SmartCampusTheme">
<!-- Splash screen while connecting to the web-server -->
<activity
android:name=".HomeScreen"
android:label="#string/title_activity_home_screen"
android:parentActivityName=".AbstractPortraitActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="greensmartcampus.eu.smartcampususerfeedbackapp.AbstractPortraitActivity" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- The activity where all actions take place -->
<activity
android:name=".ControlActivity"
android:label="#string/title_activity_home_screen"
android:parentActivityName=".AbstractPortraitActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="greensmartcampus.eu.smartcampususerfeedbackapp.AbstractPortraitActivity" />
</activity>
</application>
</manifest>
*Ps. it's funny how the most up-to-date Android Studio generates deprecated code for tabbed activities and then complains about it being deprecated as if it is your fault...
Important Note: I am a huge fan of MVC and a modularity priest (OSGi practitioner). So I would love if all these styling solutions could be all contained in the style and drawing XML files (as they should be if I correctly recall), the layout information is all contained in my layout files and my java files only contain code about behavior. For example I could just show the action bar icon with java through getSupportActionBar().setDisplayShowHomeEnabled(true), but inserting layout related stuff in java disrupts the MVC pattern. Also, the website that I mention above can create the layout with the icon in the actionbar without using a single java line. I just need to know how can that be done with AppCompat, which apparently is what I am using because other solutions are deprecated.

ActionBar is missing after switching to API21 AppCompat

While working on the Big Nerd Ranch's Criminal Intent project when I updated my AppCompat library from API 19 to API 21 I lost ActionBar. I have tried changing themes around but I can't find a way to get ActionBar.
The full source code is available here.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sudhirkhanger.app.criminalintent" >
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity android:name=".CrimeListActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".CrimePagerActivity"
android:label="#string/app_name" >
</activity>
</application>
</manifest>
style.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
</style>
</resources>
Thanks.
To use appcompat-v7, you must inherit from ActionBarActivity. CrimeListActivity inherits from SingleFragmentActivity, which in turn inherits from FragmentActivity, not ActionBarActivity.
I also had that problem I moved the whole line (android:theme="#style/AppTheme) and its works! The theme is a dark theme which looks better.
I came across this issue as well.
The solution is remove the style tag from the manifest.xml (android:theme="#style/AppTheme").
It will use the holo theme, but with the Action Bar.

Theme not being applied

I am simply trying to change the background color for an activity, however nothing has changed.
Here is the relevant XML:
styles.xml
<resources>
<style name="STBTheme" parent="android:Theme.Light" >
<item name="android:windowBackground">#color/blue</item>
</style>
</resources>
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.pedro.stb"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="15" />
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/STBTheme" >
<activity
android:name=".MainActivity"
android:label="#string/title_activity_main"
android:theme="#style/STBTheme" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Furthermore, I'm using Eclipse, and by changing the theme in the activity's xml, it does not change in the graphical layout.
Any help?
Edit
Got it to work. Have to clean the project before reloading the layout. Very annoying...
i had check your code its ok .
try <item name="android:Background">#ccff33</item>
instead of your <item name="android:windowBackground">#color/blue</item>.
and you have write android:theme="#style/STBTheme" > in application as well as activity also.
Just write in application tag .
Hope you will get your output now.
Open the preview of your activity and Click on the circled button as shown
Type the name of your custom theme and Click 'OK' as shown
In Manifest file add the attribute android:theme=".YourTheme" to the required Activity
You will have the theme of the current activity changed.
I dont know why Android Studio acts like it's drunk sometimes. I have two projects with same target,minimum SDK active. One of them had the splash screen theme implemented correctly, the other just wont show until I found this workaround.

Categories

Resources