java.lang.IllegalArgumentException:您需要将Theme.AppCompat主题(或后代)与设计库

时间:2015-11-16 18:15:56

标签: java android material-design android-theme

我正在尝试使用本教程的材料设计实现“带图像的灵活空间”:

Toolbar animation with android design support library

但我在布局预览中收到此渲染问题消息:

  

无法实例化以下类:

     

- android.support.design.widget.CoordinatorLayout(Open Class,Show Exception,Clear Cache)    - android.support.design.widget.AppBarLayout(Open Class,Show Exception,Clear Cache)

我将Theme.AppCompat主题应用于我的应用程序,但它会阻止操作栏和其他所有活动中的外观。 此外,它会在操作栏方法上引发错误,例如:

  

actionBar.setDisplayHomeAsUpEnabled(真);

将错误(粗略地)陈述为:

  

在空对象引用上调用setDisplayHomeAsUpEnabled(boolean)

此外,对整个应用程序使用Theme.AppCompat会在预览屏幕中显示以下错误:

  

找不到以下类:    - android.support.v7.internal.app.WindowDecorActionBar(修复构建路径,创建类)

因此,我不想在整个应用程序中使用Theme.AppCompat。但是,对于我要使用“带图片的灵活空间”设计的特定活动使用Theme.AppCompat,无法解决之前所述的CoordinatorLayoutAppBarLayout问题。

请告诉我该怎么做!我已经在同一个问题上阅读了很多stackoverflow帖子,但它们对我不起作用!我已经重新启动了android studio并使我的缓存无效并重启了无数次!!

以下是build.gradle

中的依赖项
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:support-v4:23.0.1'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile project(':viewPagerIndicator')
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
}

在手机上按原样运行应用程序会出现此错误:

  

java.lang.IllegalStateException:此Activity已经有一个动作   酒吧提供的窗户装饰。不要求   Window.FEATURE_SUPPORT_ACTION_BAR并将windowActionBar设置为false   您的主题是使用工具栏。

将windowActionBar设置为false,如下所示:

<item name="windowActionBar">false</item>

然后运行应用程序会抛出此错误:

  

java.lang.RuntimeException:无法启动活动   ComponentInfo {com.seven.actionbar / com.seven.actionbar.EventsDetailActivity}:   java.lang.IllegalArgumentException:AppCompat不支持   当前主题特色:{windowActionBar:false,   windowActionBarOverlay:false,android:windowIsFloating:false,   windowActionModeOverlay:false,windowNoTitle:false}

以下是EventsDetailsActivity.java文件中的工具栏位:

    Toolbar toolbar;
    CollapsingToolbarLayout collapsingToolbar;

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

        actionBarColor =
                new ColorDrawable(ContextCompat.getColor(getApplicationContext(), R.color.ufl_orange));

        tDes = (TextView)findViewById(R.id.evt_desc);
        tVenue = (TextView)findViewById(R.id.evt_venue);
        tDate = (TextView)findViewById(R.id.evt_date);
        tTime = (TextView)findViewById(R.id.evt_time);
        tPdate = (TextView)findViewById(R.id.evt_post_date);
        tPtime = (TextView)findViewById(R.id.evt_post_time);
        tCont = (TextView)findViewById(R.id.evt_contact);
        tOrg = (TextView)findViewById(R.id.evt_org);
        tCount = (TextView)findViewById(R.id.evt_count);

        //Intent intent = getIntent();
        //joinMap = (HashMap)intent.getSerializableExtra("e_uMap");
        myApp = (MyApp)getApplication();

        //action bar magic
        actionBarColor.setAlpha(0);

        toolbar = (Toolbar) findViewById(R.id.anim_toolbar);
        setSupportActionBar(toolbar);
        collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar);
        ImageView header = (ImageView) findViewById(R.id.header);

        new LoadDetail().execute();

        goingSwitch = (Switch) findViewById(R.id.btn_join);
        goingSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener()

        {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
            {
                new JoinEvents().execute(String.valueOf(isChecked));
            }
        });
    }



    @Override
    public void onStart(){
        super.onStart();
//        actionBar = this.getActionBar();
//        actionBar.setDisplayShowHomeEnabled(false);
    }

以下是与之相关的布局代码:

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".EventsDetailActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="192dp"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:expandedTitleMarginBottom="32dp"
            app:expandedTitleMarginEnd="64dp"
            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <ImageView
                android:id="@+id/header"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@drawable/monalisa"
                android:fitsSystemWindows="true"
                android:scaleType="centerCrop"
                app:layout_collapseMode="parallax" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/anim_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>'

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

ScrollView及相关的子元素(此处未显示)是该页面的主要内容。

还将主题修改为:

<style name="EventsTheme" parent="Theme.AppCompat.Light">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
</style>

IllegalStateExceptionRuntimeException消失后,我再也看不到CoordinatorLayout

2 个答案:

答案 0 :(得分:4)

您的logcat是什么抛出

  

java.lang.IllegalStateException:此Activity已经有一个动作   酒吧提供的窗户装饰。不要求   Window.FEATURE_SUPPORT_ACTION_BAR并将windowActionBar设置为false   您的主题是使用工具栏。

  1. 您的所有主题(需要操作栏/工具栏)必须继承 来自 Theme.AppCompat 。有可用的变体,包括Light 和NoActionBar。
  2. 请阅读有关AppCompat

    的正式文件

    你应该怎么做

    1. 请设置 parent="Theme.AppCompat.NoActionBar" 而不是 的父=&#34; Theme.AppCompat.Light &#34;

    2. 避免重复库调用。 support:appcompat build.gradle 部分中拨打了两次电话。

    3. 您可以在 SO

      上查看类似类型的问题
      1. Window.FEATURE_ACTION_BAR and set windowActionBar to false
      2. AppCompat does not support the current theme features

答案 1 :(得分:4)

为什么需要使用Toolbar?你需要支持一些旧的Android版本吗? 关键是Toolbar实际上不是ActionBar。它缺少一些功能,迫使您在活动中使用明确的主题。因此,如果您不需要支持某些旧版本的Android (v7.Toolbar is for SDK 7 (Android 2.1).

哦,顺便说一句:你想做什么叫做折叠工具栏布局。查看此链接以获取教程 http://antonioleiva.com/collapsing-toolbar-layout/

P.S。不要编译同一个库的不同版本!不要这样做:

compile 'com.android.support:appcompat-v7:23.0.1'
    compile project(':viewPagerIndicator')
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'

相反,请将其更改为:

compile 'com.android.support:appcompat-v7:23.0.1'
    compile project(':viewPagerIndicator')
    compile 'com.android.support:design:23.0.1'