简体   繁体   中英

How to completely replace the action bar of AppCompatActivity with custom action bar in Android?

I am absolute beginner to Android. Now I am learning how to layout an Android app. So I started to use navigation drawer to together with toolbar. Now I am creating a custom action without default features. But it is not working.

This is my main activity layout

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- This LinearLayout represents the contents of the screen  -->

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <!-- The ActionBar displayed at the top -->
        <include
            layout="@layout/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <!-- The main content view where fragments are loaded -->
        <FrameLayout
            android:id="@+id/flContent"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    <!-- The navigation drawer that comes from the left -->
    <!-- Note that `android:layout_gravity` needs to be set to 'start' -->
    <android.support.design.widget.NavigationView
        android:id="@+id/nvView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@android:color/white"
        app:menu="@menu/drawer_view" />
</android.support.v4.widget.DrawerLayout>

This is my toolbar layout

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:fitsSystemWindows="true"
    android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:background="?attr/colorPrimaryDark">

</android.support.v7.widget.Toolbar>

This is my activity class

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);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

This is style

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- 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" />

But when I start the activity, title and option to view menu items are included in the action bar even though I did not define in the layout like in screenshot.

在此处输入图片说明

So what I want to do is I want to completely replace the action bar with my custom toolbar and I want to erase the default behaviours.

So I tried to remove the title in this way in activity

setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        ActionBar actionBar = getSupportActionBar();
        actionBar.setTitle("");
        setSupportActionBar(toolbar);

But it is throwing error

This is the logcat

01-23 12:28:45.945 2972-2972/? D/AndroidRuntime: Shutting down VM
01-23 12:28:45.945 2972-2972/? W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa614a908)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime: FATAL EXCEPTION: main
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.waiyanhein.todo.todo/com.waiyanhein.todo.todo.MainActivity}: java.lang.NullPointerException
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5041)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at com.waiyanhein.todo.todo.MainActivity.onCreate(MainActivity.java:21)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5104)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.access$600(ActivityThread.java:141) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:99) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:137) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5041) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at java.lang.reflect.Method.invokeNative(Native Method) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:511) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-23 12:28:45.945 2972-2972/? E/AndroidRuntime:     at dalvik.system.NativeStart.main(Native Method) 
01-23 12:28:45.961 2972-2975/? D/dalvikvm: GC_CONCURRENT freed 249K, 13% free 2610K/2988K, paused 2ms+0ms, total 18ms
01-23 12:28:45.961 386-801/? W/ActivityManager:   Force finishing activity com.waiyanhein.todo.todo/.MainActivity
01-23 12:28:46.177 386-801/? D/dalvikvm: GC_FOR_ALLOC freed 1205K, 46% free 8703K/16012K, paused 15ms, total 15ms
01-23 12:28:46.209 386-402/? D/dalvikvm: GC_FOR_ALLOC freed 149K, 40% free 9732K/16012K, paused 19ms, total 19ms
01-23 12:28:46.241 386-402/? D/dalvikvm: GC_FOR_ALLOC freed 6K, 33% free 10832K/16012K, paused 15ms, total 15ms
01-23 12:28:46.241 386-402/? I/dalvikvm-heap: Grow heap (frag case) to 13.126MB for 2536932-byte allocation
01-23 12:28:46.301 386-401/? D/dalvikvm: GC_FOR_ALLOC freed 2K, 29% free 13307K/18492K, paused 59ms, total 59ms
01-23 12:28:46.309 386-389/? D/dalvikvm: GC_CONCURRENT freed <1K, 29% free 13307K/18492K, paused 2ms+1ms, total 10ms

So my first question is why is that throwing error when I customize the action bar in activity? Is there anything wrong with my code? My second question is how to completely replace the action bar with my custom one as I asked above.

The NullPointerException is happening because you're attempting to access and modify the support ActionBar on an Activity with a NoActionBar theme before you've set the Toolbar as the substitute. However, given your desired Options Menu behavior, you don't want to do that.

If an Activity has an ActionBar implementation, its Options Menu will automatically be created as a dropdown menu in the ActionBar itself. Since you're using a NoActionBar theme, just don't set the Toolbar as the support ActionBar , and the Options Menu will revert to the old style.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM