sasikanth sasikanth - 2 months ago 11
Android Question

getting Null pointer exception while setting the title to action bar

Error:Caused by: java.lang.NullPointerException: Attempt to invoke
virtual method 'void android.app.ActionBar.setTitle(java.lang.CharSequence)' on a null object reference


tried with getSupportActionBar() also not able to resolve the exception
please help me out in resolving this

I tried with v7 version of ActionBarActivity, extended the class with AppCompactActivity still not able to resolve.

Executed on both emulator and on real device same issue.
After opening the app its its showing unfortunately "app" stopped working.

package pizzandburger.hfad.com.pizzaandburger;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ShareActionProvider;


public class MainActivity extends Activity {

private String[] titles;
private ListView drawerList;
private DrawerLayout drawerLayout;
private ActionBarDrawerToggle drawerToggle;
private ShareActionProvider shareActionProvider;
private int currentPosition=0;
private class DrawerItemClickListener implements ListView.OnItemClickListener{

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
};

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
titles=getResources().getStringArray(R.array.items);
drawerList=(ListView)findViewById(R.id.drawer);
drawerLayout=(DrawerLayout)findViewById(R.id.drawer_layout);
drawerList.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_activated_1,titles));
drawerList.setOnItemClickListener(new DrawerItemClickListener());
if(savedInstanceState!=null){
currentPosition=savedInstanceState.getInt("position");
setActionBarTitle(currentPosition);
}
else{
selectItem(0);
}
drawerToggle=new ActionBarDrawerToggle(this,drawerLayout,R.string.open_drawer,R.string.close_drawer){
@Override
public void onDrawerClosed(View view){
super.onDrawerClosed(view);
invalidateOptionsMenu();
}
@Override
public void onDrawerOpened(View drawerView){
super.onDrawerOpened(drawerView);
invalidateOptionsMenu();
}
};
drawerLayout.setDrawerListener(drawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentManager fragmentManager=getFragmentManager();
Fragment fragment=fragmentManager.findFragmentByTag("visible_fragment");
if(fragment instanceof TopFragment){
currentPosition=0;
}
else if(fragment instanceof PizzaFragment){
currentPosition=1;
}
else if(fragment instanceof BurgerFragment){
currentPosition=2;
}
else if(fragment instanceof OtherFragment){
currentPosition=3;
}
else if(fragment instanceof BeveragesFragment){
currentPosition=4;
}
setActionBarTitle(currentPosition);
drawerList.setItemChecked(currentPosition,true);
}
});

}
private void selectItem(int position){
Fragment fragment;
currentPosition=position;
switch (position){
case 1:
fragment=new PizzaFragment();
break;
case 2:
fragment=new BurgerFragment();
break;
case 3:
fragment=new OtherFragment();
break;
case 4:
fragment=new BeveragesFragment();
break;
default:
fragment= new TopFragment();
break;
}
FragmentTransaction ft=getFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, fragment, "visible_fragment");
ft.addToBackStack(null);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
setActionBarTitle(position);
drawerLayout.closeDrawer(drawerList);
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
drawerToggle.onConfigurationChanged(newConfig);
}

@Override
protected void onPostCreate(Bundle savedInstanceState){
super.onPostCreate(savedInstanceState);
drawerToggle.syncState();
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
outState.putInt("position",currentPosition);
}

@Override
public boolean onPrepareOptionsMenu(Menu menu){
boolean drawerOpen=drawerLayout.isDrawerOpen(drawerList);
menu.findItem(R.id.action_share).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}


private void setActionBarTitle(int position){
String title;
if(position==0){
title=getResources().getString(R.string.app_name);
}
else{
title=titles[position];
}

/*******************************/
/**** here its giving error *****/
/*******************************/
getActionBar().setTitle(title);
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
getMenuInflater().inflate(R.menu.menu_main, menu);
MenuItem menuItem=menu.findItem(R.id.action_share);
shareActionProvider=(ShareActionProvider)menuItem.getActionProvider();
setIntent("this is some simple text for sharing through shareActionProvider");
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem menuitem){
if(drawerToggle.onOptionsItemSelected(menuitem)){
return true;
}
switch (menuitem.getItemId()){
case R.id.action_settings:
return true;
default:
return super.onOptionsItemSelected(menuitem);
}
}
private void setIntent(String text){
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,text);
shareActionProvider.setShareIntent(intent);
}
}


Here is my styles.xml



<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
</style>




and here is my activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout"
>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/content_frame"></FrameLayout>
<ListView
android:layout_width="240dp"
android:layout_height="match_parent"
android:id="@+id/drawer"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#ffffff"></ListView>
</android.support.v4.widget.DrawerLayout>



  1. Tried with setting the title manually it didn't work

  2. checked with debugger its unable to get ActionBarObject


Answer

Its the problem in the style sheet That says

"<style name="AppTheme.NoActionBar">"

Define some theme then you get rid of null pointer exception

Comments