无法启动MainActivity - 您需要在此活动

时间:2016-09-25 03:47:20

标签: java android android-layout android-theme androiddesignsupport

当我通过Android Studio(调试)在手机上运行时,我的应用程序正常运行。

但每当我尝试创建一个签名版本APK并在我的手机上安装发布APK时,它会立即崩溃,并在logcat中出现此错误:

  

java.lang.IllegalStateException       您需要将Theme.AppCompat主题(或后代)与此活动一起使用

根据logcat,在MainActivity的onCreate方法中发生错误。

我看过很多StackOverflow线程和其他网站&论坛尝试解决方案,但到目前为止,它们都没有对我有用。

例如,有些人没有工作:

  • android:theme="@style/Theme.AppCompat.Light"添加到AndroidManifest.xml文件中的应用程序标记。
  • 更改应用主题的名称(默认为AppTheme)
  • 使用Activity代替AppCompatActivity(我必须使用AppCompatActivity

我的所有Activity .java类扩展了AppCompatActivity,我的AppTheme扩展了Theme.AppCompat.Light.DarkActionBar,所以我不知道为什么会这样。

这里是代码(希望这是所有相关代码):

(注意:只有values / styles.xml,没有值-11,值-14等)。

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 个答案:

答案 0 :(得分:1)

Manifest中,您正在使用application标记之外的主题,请参阅下文。

<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"

将其更改为此

<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 :(得分:-1)

在styles.xml替换中,编辑AppTheme

  

“Theme.AppCompat.Light.DarkActionBar”

通过

  

“Theme.AppCompat.Light.NoActionBar”

,这应该可以解决您的问题。

原因是,你试图覆盖一个动作栏(可能)但该应用程序已经有了动作栏。希望它有所帮助