Android - MapsActivity标题栏中的后退按钮

时间:2017-04-25 10:24:27

标签: android google-maps android-layout android-fragments android-intent

我正在创建一个Android应用,在MainActivity用户中选择ListView中的一个项目,然后出现MapsActivity。我想在标题栏中使用后退按钮返回MainActivity 我尝试了一些解决方案,例如:
Android - Back button in the title bar
Display back button on action bar
它们不适合我,因为我使用的是MapsActivity

我想应该有另一种方法为MapsAvtivity执行此操作 这是我的代码:

清单文件:

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

logcat:

  

04-25 14:32:41.376 9010-9010 / com.shmj.monmemorableplaces E / AndroidRuntime:FATAL EXCEPTION:main   过程:com.shmj.monmemorableplaces,PID:9010    java.lang.RuntimeException:无法启动活动ComponentInfo {com.shmj.monmemorableplaces / com.shmj.monmemorableplaces.MapsActivity}:java.lang.NullPointerException:尝试调用虚方法'void android.app.ActionBar.setHomeButtonEnabled (boolean)'在空对象引用上   在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3124)   在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3233)   在android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5120)   在android.app.ActivityThread.access $ 1100(ActivityThread.java:197)   在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1662)   在android.os.Handler.dispatchMessage(Handler.java:102)   在android.os.Looper.loop(Looper.java:145)   在android.app.ActivityThread.main(ActivityThread.java:6856)   at java.lang.reflect.Method.invoke(Native Method)   在java.lang.reflect.Method.invoke(Method.java:372)   在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)   在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)   引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.app.ActionBar.setHomeButtonEnabled(boolean)'                                                                                    在   com.shmj.monmemorableplaces.MapsActivity $ override.onCreate(MapsActivity.java:58)                                                                                      在   com.shmj.monmemorableplaces.MapsActivity $ override.access $讯(MapsActivity.java)                                                                                      在   com.shmj.monmemorableplaces.MapsActivity.onCreate(MapsActivity.java:0)                                                                                      在android.app.Activity.performCreate(Activity.java:6550)                                                                                      在   android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1120)                                                                                      在   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3077)                                                                                      在   android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3233)                                                                                      在   android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5120)                                                                                      在android.app.ActivityThread.access $ 1100(ActivityThread.java:197)                                                                                      在   android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1662)                                                                                      在android.os.Handler.dispatchMessage(Handler.java:102)                                                                                      在android.os.Looper.loop(Looper.java:145)                                                                                      在android.app.ActivityThread.main(ActivityThread.java:6856)                                                                                      at java.lang.reflect.Method.invoke(Native Method)                                                                                      在java.lang.reflect.Method.invoke(Method.java:372)                                                                                      在   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)                                                                                      在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

5 个答案:

答案 0 :(得分:2)

public class MapsActivity extends AppCompatActivity

如果您使用的是最新的appcompact库,请使用AppCompatActivity

并且还要改变

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

}

请查看this了解详情。

答案 1 :(得分:1)

试试这段代码......

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

修改

根据你的意见,似乎你正在使用NoActionBar主题.. 现在在地图上的Activity xml中添加一个工具栏..

<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>

在java代码中添加

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

将此添加到您的styles.xml

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"/>
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark" />

答案 2 :(得分:1)

试试这个:

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

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

答案 3 :(得分:1)

您使用的是主题:Theme.AppCompat.Light.NoActionBarActionBar。我认为这就是出错的原因。如果您正在使用:

ActionBar actionBar = getActionBar();

然后,使用Theme.AppCompat.Light.DarkActionBar

另外,如果您想使用:Theme.AppCompat.Light.NoActionBar。然后,你必须声明:

ActionBar actionBar = getSupportActionBar();

您还可以在ToolBar通过布局结构中使用后退图标。

在您的布局文件中: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>

styles.xml中:使用主题=&gt; Theme.AppCompat.Light.NoActionBar

答案 4 :(得分:0)

您正在使用AppCompatActivity,请尝试   ActionBar actionBar = getSupportedActionBar();