通过setHomeAsUpIndicator()使用MaterialComponents操作栏

问题描述 投票:0回答:1

我正在使用一堆片段,试图构造一个选项卡式应用程序。以下是我的styles.xml文件中的部分:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

之后,在其中一个片段下,有一个浮动操作按钮,该按钮应重定向到新的活动页面,而与片段无关。单击该按钮后,应用程序崩溃,并显示以下信息:

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.salestrackertest3, PID: 15395
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.salestrackertest3/com.example.salestrackertest3.NewCustomerActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setHomeAsUpIndicator(int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.appcompat.app.ActionBar.setHomeAsUpIndicator(int)' on a null object reference
        at com.example.salestrackertest3.NewCustomerActivity.onCreate(NewCustomerActivity.java:42)
        at android.app.Activity.performCreate(Activity.java:7802)
        at android.app.Activity.performCreate(Activity.java:7791)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 

这是应用程序在NewCustomerActivity.java类下抱怨的行:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close);

我已经尝试将NoActionBar更改为具有DarkActionBar之类主题的操作栏,但没有任何更改。当我运行该应用程序时,片段看起来可以正常工作,但是当我单击fragment_customer.xml下的FAB按钮导航新活动时,应用程序崩溃。以下是CustomerFragment.java下的导航块:

    FloatingActionButton buttonAddCustomer = view.findViewById(R.id.button_add_customer);
    buttonAddCustomer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), NewCustomerActivity.class);
            startActivityForResult(intent, NEW_CUSTOMER_ACTIVITY_REQUEST_CODE);
        }
    });

以下是MainActivity的布局:

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

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/white">

        </androidx.appcompat.widget.Toolbar>

        <com.google.android.material.tabs.TabLayout
            android:id="@+id/tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

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

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">

    </androidx.viewpager.widget.ViewPager>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

我是android编程的新手,我不知道是否有解决此问题的明确方法。预先感谢。

编辑:这些是应用无法加载的NewCustomerActivity的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".NewCustomerActivity"
    android:padding="16dp">

    <EditText
        android:id="@+id/customer_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-light"
        android:hint="Customer Name"
        android:inputType="text" />

    <EditText
        android:id="@+id/customer_phoneNo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-light"
        android:hint="Phone Number"
        android:inputType="phone" />

    <EditText
        android:id="@+id/customer_address_street"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-light"
        android:hint="Street"
        android:inputType="text"/>

    <EditText
        android:id="@+id/customer_address_postCode"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-light"
        android:hint="PostCode"
        android:inputType="text"/>

    <EditText
        android:id="@+id/customer_address_addressLine"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fontFamily="sans-serif-light"
        android:hint="Address"
        android:inputType="textMultiLine" />

    <Button
        android:id="@+id/button_save"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimary"
        android:text="Save" />

</LinearLayout>
java android xml
1个回答
0
投票

您使用的是ActionBar,但是确实有一个自定义工具栏,因此,您必须首先分配工具栏以充当操作栏,否则您的操作栏将为null。

尝试添加:

setSupportActionBar(toolbar)

之后,您可以调用getSupportActionBar()并确保它不为null。

© www.soinside.com 2019 - 2024. All rights reserved.