B4A Library AppCompat - Make Material Design apps compatible with older Android versions

This library is a wrapper for the Google AppCompat v7 support library.

B4A V6.0 or newer is required!
From V3.52 on B4A V6.80 or newer is required! If you still use B4A < V6.80, use V3.51 of this library.

The main reason for this library is to make your apps compatible with older Android versions and to use features in old Android versions which were implemented in newer Android releases. One big advantage of this library is that you can bring Material Design to pre Lollipop Android devices.

Setting up the library
Note: Please, Please read these instructions carefully. AppCompat depends on many things like a special theme with special features. Even special versions of build tools are required and last but not least there are often bugs in the Google support libraries.

I created this instructions to help you getting things ready for using AppCompat. So please follow these instructions carefully and all should work as expected and you don't have to ask in the forum.

Thanks.

The library uses the Android Support Repository. Please install it from the Extras Section of the Android SDK Manager. If you upgrade from an earlier release you can deinstall the "Android Support Library" since it is outdated and marked as obsolete in the Android SDK.
  1. First copy the AppCompat.jar, AppCompat.aar and AppCompat.xml files to your additional libraries folder.
  2. Start the Android SDK-Manager and download/update the latest Extras->Android Support Repository. Use at least support repository 36!
  3. In Android SDK-Manager be sure that the "Android SDK Build-tools" 25.x.x is installed! Deinstall all versions prior to version 25! If you leave older versions than 23.0.3 of build tools installed, your compiled app may work on Android 5.0 and above but it will fail on older Android versions like KitKat.
  4. In the B4A IDE in your projects check the AppCompat library on the libraries tab.
  5. Make sure that you reference the latest android.jar in the IDE under the "Tools/Configure Paths" menu. Don't worry. The android.jar is only used for compilation. It does not mean that you can't run your app on lower Android Versions. The Support libraries require to compile against the same API version as the library itself. So for Support library 25.xx which is the current now you should compile with API25 android.jar.
  6. If you are updating from a version older than v3.20 then remove the b4a_appcompat resource folder delivered with older versions of this library.
To use the AppCompat library your activities MUST extend android.support.v7.app.AppCompatActivity (extending the old android.support.v7.app.ActionBarActivity still works.)

B4X:
 #Extends: android.support.v7.app.AppCompatActivity

Additionally you MUST use one of the AppCompat themes like Theme.AppCompat. You can set it directly in the manifest editor or create your own theme that has an AppCompat theme as its parent. The easiest way is to set the AppCompat theme in the manifest:

B4X:
SetApplicationAttribute(android:theme, "@style/Theme.AppCompat")

If you have upgraded this library from an older version than 3.20 then you have to remove the #AdditionalRes: attribute related to the AppCompat library from your projects. They are not needed anymore.

Some Tutorials for this library
Material Design 2 - Using the AppCompat library
Material Design 3 - Using a ToolBar as ActionBar
Material Design 4 - Modifyable and advanced Menu

Troubleshooting Guide
Because it is not so easy to setup this library I will try to give a troubleshooting guide here for the most common problems.

1. Compile always with the newest android.jar file. This can be configured in the IDE under "Tools/Configure Paths". Download the latest platform version with the SDK Manager and configure it with the IDE. Don't worry, your app will still run on older platform versions. AppCompat support library needs this only at compile time.

2. Be sure you have a correct theme file for your project. If the app seems to crash immediately without a stack trace it is most probably a problem with the theme file.

3. If you post your issue in the forum please provide the stack trace of the error! And before you post, please do a forum seach. Most probably the same error was previously reported by another user. If you don't see a stack trace in the log window, please try the unfiltered logs. Unfortunately most errors only show when you have your device connected via USB in the unfiltered logs.

4. If you post your issue in the forum please provide as many information as possible. The error you receive, screenshots if possible and most important: the stack trace.

Your support:
Creating libraries and wrappers for existing library projects is a lot of work. The use of this library is totally free and you even don't need to mention in your app that you use it.
But if you use this library in your projects and you think it is useful to you please consider to make a donation:

Thanks very much for your support.

Version History

V1.00
  • Object AppCompat - Utilities which are useful for working with AppCompat
  • Object ACActionBar - Like StdActionBar or StdActionBarHelper to control some features of the ActionBar.
  • Object ACEditText - Replacement for EditText with Material Design colors.
  • Object ACCheckBox - Replacement for CheckBox with Material Design colors.
  • Object ACRadioButton - Replacement for RadioButton with Material Design colors.
  • Object ACSwitch - Wrapper for a Switch.
  • Object ACFlatButton - Borderless Button for Dialogs etc.
V1.10
  • New object ACToolBarLight - Toolbar for light themes
  • New object ACToolBarDark - Toolbar for dark themes
  • New object ACActionMenu - Create action menus (action items and/or overflow menu everywhere in your layout. (The view needs to have a minimum width of 56dip to work properly. This seems to be a bug and hopefully will change in later versions of the AppCompat library)
  • New object ACActionModeWrapper - Change ActionBar/Toolbar to an ActionMode ActionBar. Mostly used for multiselect lists.
  • New object ACMenu - Access and modify the ActionMode, ActionMenu or Toolbar menus.
  • New object ACMenuItem - Access and modify the ActionMode, ActionMenu or Toolbar menu items.
  • New object ACPopupMenu - Implements a popup menu.
  • New object ACSearchView - Add a search view to your ActionBar/Toolbar
  • Add: AppCompat object has new methods for getting height of system components like StatusBar, ActionBar and NavigationBar.
  • Add: AppCompat object has a new method for setting the elevation of every view. With this all views (like Panels) can cast shadows. Unfortunately the shadow is only visible on Android 5.0 or above.
V2.00
  • #Extends: android.support.v7.app.AppCompatActivity should now be used (ActionBarActivity still works)
  • New object ACSpinner - AppCompat Spinner with additional support to show an icon in front of the text.
  • New object ACSubMenu - Adding Submenus to menus.
  • New Event ACSearchView_QueryChanged
  • Some internal changes (xml files for Views are not needed anymore)
  • Support for tinting Drawables.
  • Possibility to set a click effect to any view - This is experimental. It should add a ripple effect in Lollipop and above and a color change in previous versions.
  • To update from V1.xx to V2.00 delete the b4a_appcompat resource folder and copy the new one from the archive. The old xml files for buttons, edittext etc. are not needed anymore. Now there is only one xml for the spinner needed.
V3.00
  • Requires B4A 6.0 or above
  • References AppCompat from Maven repository
  • Full designer custom properties support for all views
  • Fix: ACRadioButton now supports grouping in a panel
  • Desupport of the Activity Entry animation.
  • New: ACSeekbar
  • Fix: ACSearchview closed() event does not fire (AppCompat bug). Added workaround for this.
  • Fix: Fixed several minor and major bugs
  • New example App which shows main features
V3.01

  • Fix: additionally depends on com.android.support:support-v4 which should make it work better if you mix old and new libraries.
  • Fix: ACSearchview_Closed event will not crash on API < 12 but it will not fire on these devices. Sorry, there is no workaround for this.
V3.20
  • Moved resource files to aar library file - see new setup instructions
  • Fix: ACButton ButtonColor attribute now works on all Android versions.
V3.30
  • Fix: Remove log output from ACSpinner
  • Fix: Hopefully fixed crashes with missing designer properties
  • Fix: Mixed case Eventnames in Toolbars now working
  • New: Support for ActionViews in MenuItems (Needed for CustomViews in NavigationView of DesignSupport library)
  • Change: Minimum Support Repository 36
V3.41:
  • Fix: Change packagename to anywheresoftware.b4a.orbjects to reduce resouce fields
V3.42:
  • Fix: ToolBars should raise their events correctly again.
V3.50:
  • New: Support for CharSequences wherever possible.
V3.51
  • Fix: Getters return String instead of CharSequence again to avoid problems.
V3.52
  • Fix: Compiled against B4A 6.80 Core library to avoid some problems with CharSequences.
V4.00
  • Change: Compiled against 28.0.0 Support library
  • New: Styles for most Views
 

Attachments

  • AppCompatBaseExample3_20.zip
    10.9 KB · Views: 4,741
  • AppCompatLib3_51.zip
    87.2 KB · Views: 2,503
  • AppCompatLib3_52.zip
    87.3 KB · Views: 4,425
  • AppCompatLib4_00.zip
    181.8 KB · Views: 4,603
Last edited by a moderator:

corwin42

Expert
Licensed User
Longtime User
@corwin42 check the attached library. I added an aar package with the resources.
This saves the need to copy the resource folder and add it with #AdditionalRes.

I've modified the xml file to add the aar file.

Huh, now you earned the skill of mind reading? :eek:

I was just about to ask, if it is possible to provide a library as AAR so that the resources are included. I guess B4A still requires a .xml/.jar combination and not .xml/.aar?
But your solution is great, too. Just three files to copy into the additional libs folder and forget about all the resources.

I will update the library again. :)
 

corwin42

Expert
Licensed User
Longtime User
Updated the library in the first post to Version 3.20

This version uses an aar library for the resources so you can remove all these annoying #AdditionalRes attributes from your AppCompat projects.
See the changed library setup instructions in the first post.

Sorry for the high update frequency in the last days. Hope this will get better now.
 

corwin42

Expert
Licensed User
Longtime User
I refer logfile

Hmm, seems to be the same error ggpanta has:
$NotFoundException: File res/drawable-v19/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013

What device is this?
Which Android version?
 

corwin42

Expert
Licensed User
Longtime User
Maybe I have found the problem.

@aarroyo and @ggpanta:
Which "Android SDK Build-tools" do you have installed in SDK Manager? The VectorDrawable feature is directly related to the aapt tool. Currently you should use "Android SDK Build-tools" 23.0.3. If I'm correct, B4A always uses the latest installed version. There are problems with 24.0.0 so stick with 23.0.3 for the moment.
 

chuath

Member
Licensed User
Longtime User
It fails here:
android.content.res.Resources$NotFoundException: File res/drawable-v19/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013

threadid=1: thread exiting with uncaught exception (group=0xa4d4db20)
FATAL EXCEPTION: main
Process: de.amberhome.appcompat.basicexample, PID: 2092
java.lang.RuntimeException: Unable to start activity ComponentInfo{de.amberhome.appcompat.basicexample/de.amberhome.appcompat.basicexample.main}: android.content.res.Resources$NotFoundException: File res/drawable-v19/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: File res/drawable-v19/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
at android.content.res.Resources.loadDrawable(Resources.java:2101)
at android.content.res.Resources.getDrawable(Resources.java:700)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:193)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:181)
at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:689)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:186)
at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:77)
at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:83)
at android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.java:146)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:28)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:41)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:193)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:173)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:511)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:71)
at de.amberhome.appcompat.basicexample.main.onCreate(main.java:33)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
... 11 more
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
at android.content.res.Resources.loadDrawable(Resources.java:2097)
... 30 more
Force finishing activity de.amberhome.appcompat.basicexample/.main

May i know if this has been resolved ?
I have encounter this error exactly.
My device(Galaxy Nexus) with Android 4.4.4 force close on startup.
I am using ver3.20 of AppCompat with latest repo etc.
 

corwin42

Expert
Licensed User
Longtime User
May i know if this has been resolved ?
I have encounter this error exactly.
My device(Galaxy Nexus) with Android 4.4.4 force close on startup.
I am using ver3.20 of AppCompat with latest repo etc.

Yes. See post #189.
You need to install Android SDK Build Tools 23.0.3.
 

chuath

Member
Licensed User
Longtime User
Yes. See post #189.
You need to install Android SDK Build Tools 23.0.3.

I saw that post and did not have Build Tools 24.0 installed at all. I am still using 23.0.3
I tried to delete 23.0.3 and install back again. This problem still persist.
 

corwin42

Expert
Licensed User
Longtime User
I saw that post and did not have Build Tools 24.0 installed at all. I am still using 23.0.3
I tried to delete 23.0.3 and install back again. This problem still persist.
Hmm, have you tried a "Clean project..."? Or just remove the complete Objects folder so that everything is generated again for sure.
 

chuath

Member
Licensed User
Longtime User
Hmm, have you tried a "Clean project..."? Or just remove the complete Objects folder so that everything is generated again for sure.

Cleaned and still unresolved.
However IF i delete the android-support-v7-appcompat.jar and android-support-v4.jar from my AdditionalLib directory.
It prompted for those 2 files to be available. Is it possible MSMaterialDrawer is requesting for it instead?
It hasn't been updated for a while and might be a possible cause since it uses appcompat also???


Tested and proved that MSMaterialDrawer is not the culprit as i did a test to remove all traces of it and the problem still persist.
 
Last edited:

corwin42

Expert
Licensed User
Longtime User
Cleaned and still unresolved.
However IF i delete the android-support-v7-appcompat.jar and android-support-v4.jar from my AdditionalLib directory.
It prompted for those 2 files to be available. Is it possible MSMaterialDrawer is requesting for it instead?
It hasn't been updated for a while and might be a possible cause since it uses appcompat also???


Tested and proved that MSMaterialDrawer is not the culprit as i did a test to remove all traces of it and the problem still persist.

Are you absolutely sure that you have the exact same error? Can you post your Stacktrace here?
 

chuath

Member
Licensed User
Longtime User
Are you absolutely sure that you have the exact same error? Can you post your Stacktrace here?

B4X:
Failed to find resource
android.content.res.Resources$NotFoundException: File res/drawable-v19/abc_ic_ab_back_material.xml from drawable resource ID #0x7f020013
    at android.content.res.Resources.loadDrawable(Resources.java:2230)
    at android.content.res.Resources.getDrawable(Resources.java:733)
    at android.content.res.Resources.getDrawable(Resources.java:711)
    at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:354)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:193)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:181)
    at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:689)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:186)
    at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:77)
    at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:83)
    at android.support.v7.app.AppCompatDelegateImplV7.<init>(AppCompatDelegateImplV7.java:146)
    at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:28)
    at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:41)
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:193)
    at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:173)
    at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:511)
    at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:71)
    at com.b4a.example.main.onCreate(main.java:33)
    at android.app.Activity.performCreate(Activity.java:5312)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2178)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2280)
    at android.app.ActivityThread.access$800(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1202)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5059)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:877)
    at android.content.res.Resources.loadDrawable(Resources.java:2226)
    ... 31 more
Shutting down VM
threadid=1: thread exiting with uncaught exception (group=0x416a9ba8)
FATAL EXCEPTION: main

Exactly the same
 

corwin42

Expert
Licensed User
Longtime User
Exactly the same

I'm running out of ideas.

I'm quite sure that the wrong AppCompat version is linked with your project or the wrong tools are used.

Try the following:
- Replace the android-support-v4.jar and android-support-v7-appcompat.jar files in your additional libs folder with empty zip files.
- Check if the support repository is not corrupted. There should be a extras\android\m2repository\com\android\support\appcompat-v7\24.0.0 folder in your SDK installation and the appcompat-v7-24.0.0.aar should have 929kB. Even try to open it with a zip program.
- Check if the only existing folder in <SDK>\build-tools is the 23.0.3 folder.
- If nothing helps post the project and I will try it here but I guess it will work when I compile it.
 

chuath

Member
Licensed User
Longtime User
I'm running out of ideas.

I'm quite sure that the wrong AppCompat version is linked with your project or the wrong tools are used.

Try the following:
- Replace the android-support-v4.jar and android-support-v7-appcompat.jar files in your additional libs folder with empty zip files.

Tested. No Effect.

- Check if the support repository is not corrupted. There should be a extras\android\m2repository\com\android\support\appcompat-v7\24.0.0 folder in your SDK installation and the appcompat-v7-24.0.0.aar should have 929kB. Even try to open it with a zip program.

Still NO

- Check if the only existing folder in <SDK>\build-tools is the 23.0.3 folder.
- If nothing helps post the project and I will try it here but I guess it will work when I compile it.

YES ! This one did the tricks !!! Many Thanks !!!
 

wes58

Active Member
Licensed User
Longtime User
When you use ACSpinner and click on it, in the log appears line "hasIcon: false". It shows in th log multiple times on every click. Is there any reason for it or can it be removed from the next version of the library?
 
Top