包括一个使用androidx的工具栏会使我的应用程序崩溃

p3rjfoxz  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(433)

您好,我查找了以前关于使用androidx的工具栏的问题,但没有找到关于我的特定状态的答案,它在我的activity\u main.xml中包含此工具栏时不断崩溃:以下是我的工具栏xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >
    </androidx.appcompat.widget.Toolbar>

</LinearLayout>

my mainactivity.java代码:

package com.hfad.bitsandpizzas.ui.activities;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;
import com.hfad.bitsandpizzas.R;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
}

这是我在gradle构建中添加的依赖项:

dependencies {

    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.13.1'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

这是我的日志错误:
原因:java.lang.classcastexception:android.widget.linearlayout无法转换为com.hfad.bitsandpizzas.ui.activities.mainactivity.oncreate上的androidx.appcompat.widget.toolbar

brvekthn

brvekthn1#

要么你膨胀了错误的视图,要么你的主题已经有了工具栏。

使用默认主题

如果使用包含动作栏的材质设计主题(例如: Theme.MaterialComponents.DayNight.DarkActionBar ),则不需要提供操作栏/工具栏,因为它将在那里。

使用默认主题但不使用“工具栏”

如果你想拥有自己的 AppBarLayout/MaterialToolbar (所以你可以自定义),然后你需要改变活动的主题(或者整个应用程序,如果你在任何地方都这样做的话) Theme.MaterialComponents.DayNight.NoActionBar 所以无论哪种情况,在你的 themes.xml 定义应用程序主题的位置。。。

<style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.NoActionBar">
  <item name="colorPrimary">@color/...</item>

Etc..
...

确保您的 AndroidManifest.xml 指向您定义的主题:

<application
    android:theme="@style/Theme.MyApplication"
    ...

或者至少定义您的活动以使用清单中的主题:

<activity
            android:name="com.your.WhateverActivity"
            android:theme="@style/Theme.MyApplication" />

那么活动本身中的kotlin/java代码呢?

根据您的解决方案(使用主题或提供您自己的),您将需要更多或更少的代码。
如果你选择使用 DarkActionBar (或轻!),那你就不需要别的了。你的“actionbar”是为你设置的。您也不需要xml中的任何内容。只是 setContentView(R.layout.yourLayout) 你可以走了。
如果你选择使用 NoActionBar 变量,则除非添加一个操作栏,否则将没有操作栏。
所以在xml中。。。您将需要这样的内容(注意:这是android模板为“空活动”提供的默认布局,我删除了textview并添加了appbarlayout+material工具栏):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:elevation="2dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbar"
            style="@style/Widget.MaterialComponents.Toolbar.Primary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </com.google.android.material.appbar.AppBarLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

现在在mainactivity.kt。。。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val toolbar = findViewById<MaterialToolbar>(R.id.toolbar)
        setSupportActionBar(toolbar)
    }
}

如果主题是 NoActionBar ,否则 setSupportActionBar 将抛出一个illegalstateexception,说“你已经有一个操作栏”或类似的。有一个解决方法(可以在主题中将“windowactionbar”设置为false以覆盖默认值,但如果是这样的话,我宁愿使用另一个主题)。

更新(java)

java真的没什么不同。如果您的活动是在java中进行的,则看起来是这样的:

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity {

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

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
    }
}

相关问题