1

I'm making an Android app which in the MainActivity user select an Item in a ListView and a MapsActivity comes up. I want a Back Button in title bar for going back to MainActivity.
I have tried some solutions which are here, like:
Android - Back button in the title bar and
Display back button on action bar and
They are no suitable for me, cause I'm using a MapsActivity.

I guess there should be another way for doing this for MapsAvtivity.
here is my code:

manifest file:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_maps_key"
            />

        <activity
            android:name=".MapsActivity"
            android:label="@string/title_activity_maps"
            android:parentActivityName=".MainActivity" >
            <!-- Parent activity meta-data to support 4.0 and lower -->
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="com.shmj.monmemorableplaces.MainActivity" />
        </activity>
    </application>

MapsActivity.java:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    SupportMapFragment mapFragment;
    Intent mainIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        mainIntent = new Intent(getApplicationContext(), MainActivity.class);

        ActionBar actionBar = getActionBar();
        getActionBar().setHomeButtonEnabled(true);
        getActionBar().setDisplayHomeAsUpEnabled(true);   

    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(mainIntent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

and logcat:

04-25 14:32:41.376 9010-9010/com.shmj.monmemorableplaces E/AndroidRuntime: FATAL EXCEPTION: main Process: com.shmj.monmemorableplaces, PID: 9010 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shmj.monmemorableplaces/com.shmj.monmemorableplaces.MapsActivity}:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setHomeButtonEnabled(boolean)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3124) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3233) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5120) at android.app.ActivityThread.access$1100(ActivityThread.java:197) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1662) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:6856) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setHomeButtonEnabled(boolean)' on a null object reference at com.shmj.monmemorableplaces.MapsActivity$override.onCreate(MapsActivity.java:58) at com.shmj.monmemorableplaces.MapsActivity$override.access$dispatch(MapsActivity.java) at com.shmj.monmemorableplaces.MapsActivity.onCreate(MapsActivity.java:0) at android.app.Activity.performCreate(Activity.java:6550) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3077) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3233)  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5120)  at android.app.ActivityThread.access$1100(ActivityThread.java:197)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1662)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:145)  at android.app.ActivityThread.main(ActivityThread.java:6856)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

Community
  • 1
  • 1

5 Answers5

1
public class MapsActivity extends AppCompatActivity

Use AppCompatActivity if you are using latest appcompact library.

and also change

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

    ActionBar actionBar = getSupportActionBar();
    assert actionBar != null;
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setHomeButtonEnabled(true);

    mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    mainIntent = new Intent(getApplicationContext(), MainActivity.class);

}

please check this for more details.

Community
  • 1
  • 1
Amit Vaghela
  • 22,772
  • 22
  • 86
  • 142
  • Again that error : `java.lang.RuntimeException: Unable to start activity ComponentInfo{com.shmj.monmemorableplaces/com.shmj.monmemorableplaces.MapsActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.app.ActionBar.setDisplayHomeAsUpEnabled(boolean)' on a null object reference`. in `MapsActivity` there is no bar up there, I mean the whole screen is showing the map. there are no toolbar that shows a back button. –  Apr 25 '17 at 10:51
  • replace code i have posted. check my update answer@ShahriarMJ – Amit Vaghela Apr 25 '17 at 11:04
  • in your xml you should have : – Amit Vaghela Apr 25 '17 at 11:05
  • for back button use **actionBar.setHomeAsUpIndicator(R.drawable.back_dark);** and now you can use **"Theme.AppCompat.Light.DarkActionBar"** in AndroidManifest. – Amit Vaghela Apr 25 '17 at 11:09
  • you can tell me if you are stuck with it.@ShahriarMJ – Amit Vaghela Apr 25 '17 at 11:21
  • the code `ActionBar actionBar = getSupportActionBar();` should become `android.support.v7.app.ActionBar actionBar = getSupportActionBar();` .and yeeeessssssss. it worked. thank you. –  Apr 25 '17 at 11:30
0

you are using AppCompatActivity so try ActionBar actionBar = getSupportedActionBar();

Imtiyaz Khalani
  • 2,037
  • 18
  • 32
  • android studio cannot resolve method `getSupportedActionBar`. I've tried it before –  Apr 25 '17 at 10:44
0

Try this code...

ActionBar actionBar = getSupportActionBar();
if(actionBar!=null){
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
} 

Edit

As per you commemt seems like you are using NoActionBar theme.. now add a toolbar in your maps Activity xml on top..

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:id="@+id/myAppBar"
        app:elevation="0dp"
        android:theme="@style/AppTheme.AppBarOverlay">
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:contentInsetStart="0dp"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>
    </android.support.design.widget.AppBarLayout>

And in java code add

Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar); 
if(getSupportActionBar!=null){
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

Add This to your styles.xml

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark" />
Abhishek Singh
  • 9,008
  • 5
  • 28
  • 53
  • That `if` makes the error disappear, but no back button is displayed! –  Apr 25 '17 at 10:58
  • android studio can not resole `AppBarOverlay` and `PopupOverlay`. thank you for your help man. –  Apr 25 '17 at 11:22
  • @ShahriarMJ it just style for toolbar.. ok i have added in my answer just put these two lines in your `styles.xml` and your problem will resolve – Abhishek Singh Apr 25 '17 at 11:25
0

try this :

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setHomeButtonEnabled(true);

or

getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setDisplayShowHomeEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
Bhupat Bheda
  • 1,968
  • 1
  • 8
  • 13
  • none of them are working, I think the problem is that there is no Action bar defined in `activity_maps.xml` file. –  Apr 25 '17 at 11:01
0

You are using theme:Theme.AppCompat.Light.NoActionBar and ActionBar. I think this is the reason for that error. If you are using:

ActionBar actionBar = getActionBar();

Then, use Theme.AppCompat.Light.DarkActionBar.

Also, if you want to use: Theme.AppCompat.Light.NoActionBar. Then, you have to declare:

ActionBar actionBar = getSupportActionBar();

You can also use back icon in your ToolBar via layout structure.

In your layout file like: activity_main:

<RelativeLayout 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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wolfmatrix.dummy.MainActivity">

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbarId"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="@color/colorPrimary">

    <TextView
        android:id="@+id/toolbarTextId"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:textColor="@android:color/white"
        android:textSize="14sp" />
</android.support.v7.widget.Toolbar>

<ImageButton
    android:id="@+id/backButtonIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/colorPrimary"
    android:gravity="left"
    android:padding="10dp"
    app:srcCompat="@drawable/ic_arrow_back_black_24dp" />

</RelativeLayout>

In styles.xml: use theme => Theme.AppCompat.Light.NoActionBar

Satan Pandeya
  • 3,747
  • 4
  • 27
  • 53
  • I have tried `DarkActionBar` solution, I've edited `stile.xml` and `manifest` and the code in `onCreate` method, I still get that error and app crashes. the `NoActionbar` have that error too. –  Apr 25 '17 at 11:16
  • Try with xml file as alternative. – Satan Pandeya Apr 25 '17 at 11:25