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.