带有 appcompat 库 v7 的 ActionBar(ava.lang.IllegalStateException:您需要使用 Theme.AppCompat 主题)

Posted

技术标签:

【中文标题】带有 appcompat 库 v7 的 ActionBar(ava.lang.IllegalStateException:您需要使用 Theme.AppCompat 主题)【英文标题】:ActionBar with appcompat library v7 (ava.lang.IllegalStateException: You need to use a Theme.AppCompat theme) 【发布时间】:2015-08-04 05:53:01 【问题描述】:

我想用 android v7 appcompat 库实现一个 ActionBar 以支持适用于 Android >= 2.1 的 ActionBar

我的应用从 MainActivity 开始,其中包含一个深色的 Actionbar、一些信息和一个开始按钮。

下一个活动是 MenuActivity,它还包含深色的 Actionbar 和一些可以滑动的 ActionBar Tabs


这是我的 manifest.xml,带有 DarkActionBar 主题:

<application
    android:icon="@mipmap/ic_launcher"
    android:label="Hello World"
    android:theme="@android:style/Theme.Holo.Light.DarkActionBar">

    <activity
        android:name=".MainActivity"
        android:label="Hello World">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".gui.MenuActivity"
        android:label="Hello World" />

</application>

这是 MainActivity 之后的 MenuActivity,其中还包含操作栏和一些导航选项卡:

package myapp.gui;

import android.support.v4.app.FragmentTransaction;
import android.content.Intent;
import android.os.Bundle;
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.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuInflater;
import myapp.R;

public class MenuActivity extends ActionBarActivity implements ActionBar.TabListener 

    AppSectionsPagerAdapter mAppSectionsPagerAdapter;
    ViewPager mViewPager;

    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager());
        ActionBar actionBar = getSupportActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mAppSectionsPagerAdapter);
        mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() 
            @Override
            public void onPageSelected(int position) 
                actionBar.setSelectedNavigationItem(position);
            
        );

        actionBar.addTab(actionBar.newTab().setText("Home").setTabListener(this));
        actionBar.addTab(actionBar.newTab().setText("Imprint").setTabListener(this));
    

    ... 


如果我启动应用程序,MainActivity 工作,但单击启动按钮并加入 MenuActivity 后,我收到此错误:

java.lang.RuntimeException:无法启动活动 组件信息myapp.gui.MenuActivity: java.lang.IllegalStateException:您需要使用 Theme.AppCompat 此活动的主题(或后代)。

我找到了一些解决方案,但不适合我的问题。有人可以帮帮我吗?

我还想知道我的解决方案是最新的还是过时的?

谢谢你:)

【问题讨论】:

【参考方案1】:

将 AndroidManifest.xml 中的 @android:style/Theme.Holo.Light.DarkActionBar 替换为 @style/Theme.AppCompat.Light.DarkActionBar

确保您的 build.gradle 中有以下依赖项:compile 'com.android.support:appcompat-v7:22.1.1'

编辑:也检查 Knossos 的第一条评论!

【讨论】:

另外,如果您在主题中也需要自己的样式,您可以将主题的父级设置为@style/Theme.AppCompat.Light.DarkActionBar 如果我这样做,MainActivity 的 ActionBar 会消失,并且 3 点菜单的下拉菜单会出现在操作栏中而不是其中 @Stampy 然后将ActionBarActivity 替换为AppCompatActivity 这解决了我的第一个 MainActivity 问题,谢谢。但是操作栏的下拉菜单仍然出现在操作栏中,而不是在其下方 @Karim 提问:***.com/questions/30397155/…【参考方案2】:

如果您在MainActivity 中扩展ActionBarActivity,您还必须更改values-v11 中的父主题。 所以values-v11 中的style.xml 将是-

 <?xml version="1.0" encoding="utf-8"?>
 <resources>
    <style name="QueryTheme" parent="@style/Theme.AppCompat">
    <!-- Any customizations for your app running on devices with Theme.Holo here -->
    </style>
 </resources>

并确保将AndroidManifest.xml 中的@android:style/Theme.Holo.Light.DarkActionBar 替换为@style/Theme.AppCompat.Light.DarkActionBar

【讨论】:

以上是关于带有 appcompat 库 v7 的 ActionBar(ava.lang.IllegalStateException:您需要使用 Theme.AppCompat 主题)的主要内容,如果未能解决你的问题,请参考以下文章

使用带有新工具栏的选项卡 (AppCompat v7-21)

如何从 Android appcompat v7 21 库中实现 DrawerArrowToggle

为啥每当我创建新项目时 Eclipse 会自动添加 appcompat v7 库支持?

缺少来自android appcompat v7-21.0.0的样式

新建项目找不到android studio:appcompat v7:27.+包。

使用Tab与新ToolBar(AppCompat v7-21)