我正在创建一个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)
答案 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.NoActionBar
和ActionBar
。我认为这就是出错的原因。如果您正在使用:
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();