0
votes

My app works when I run it on my phone through Android Studio (Debug).

But whenever I try to create a signed release APK and install the release APK on my phone it crashes immediately with this error in the logcat:

java.lang.IllegalStateException You need to use a Theme.AppCompat theme (or descendant) with this activity

According to logcat the error happens during the MainActivity's onCreate method.

I've looked at many StackOverflow threads and other websites & forums trying solutions, but none of them have worked for me so far.

For example, some of them that didn't work:

  • Adding android:theme="@style/Theme.AppCompat.Light" to the application tag in the AndroidManifest.xml file.
  • Changing the name of the app's theme (default is AppTheme)
  • Using Activity instead of AppCompatActivity (I must use AppCompatActivity for this)

All my Activity .java classes extend AppCompatActivity, and my AppTheme extends Theme.AppCompat.Light.DarkActionBar so I have no idea why this is happening.

Here's the code (hopefully this is all the relevant code):

(note: there is only values/styles.xml, no values-11, values-14, etc.)

styles.xml:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- 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="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="org.drawsmile.mealsonandroid" >

        <!--
             The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
             Google Maps Android API v2, but you must specify either coarse or fine
             location permissions for the 'MyLocation' functionality. 
        -->

        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

        <application
            android:name="android.support.multidex.MultiDexApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name" >
            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>
            <!--
                 The API key for Google Maps-based APIs is defined as a string resource.
                 (See the file "res/values/google_maps_api.xml").
                 Note that the API key is linked to the encryption key used to sign the APK.
                 You need a different API key for each encryption key, including the release key that is used to
                 sign the APK for publishing.
                 You can define the keys for the debug and release targets in src/debug/ and src/release/. 
            -->
            <meta-data
                android:name="com.google.android.geo.API_KEY"
                android:value="@string/google_maps_key" />

            <activity
                android:name=".MapsActivity"
                android:label="@string/title_activity_maps" />
            <activity android:name=".AuthenticationActivity"/>

            <service android:name=".FirebaseCMService" >
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT" />
                </intent-filter>
            </service>
        </application>

    </manifest>

activity_main.xml:

android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context="org.drawsmile.mealsonandroid.MainActivity">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    android:paddingTop="0dp">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|enterAlways"
        app:popupTheme="@style/AppTheme.PopupOverlay">

    </android.support.v7.widget.Toolbar>

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="@android:color/holo_red_light"
        android:textColor="#fff"
        android:paddingTop="8dp"
        android:paddingBottom="8dp" />

</android.support.v4.view.ViewPager>

MainActivity.java

package org.drawsmile.mealsonandroid;

...

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;

...

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

...

}
2

2 Answers

1
votes

In your Manifest you are applying theme outside of application tag see below.

<application
        android:name="android.support.multidex.MultiDexApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" >
        android:supportsRtl="true"

        android:theme="@style/AppTheme"

change it to this

<application
        android:name="android.support.multidex.MultiDexApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" 
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
-1
votes

In your styles.xml replace , edit the AppTheme

"Theme.AppCompat.Light.DarkActionBar"

by

"Theme.AppCompat.Light.NoActionBar"

, this should solve your problem.

The reason is, you are trying to override an actionbar(probably) but the app already has actionbar. Hope it helps