Android: 如何在不使用地图的情况下实现 com.google.android.gms.maps.MapView activity
Android: How to implement com.google.android.gms.maps.MapView without using a map activity
我尝试在线性布局中实现 MapView
,但此布局不属于 MapActivity
。此外,我没有使用 fragment
来实现该过程。
我还从 Google 开发人员控制台获得了一个 api 密钥,并启用了一些与位置和地图相关的 api。
这是我在 android 工作室中的 android 清单,
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sec.asdf_solutions.biz.security">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".SplashScreenActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LoginActivity"></activity>
<activity
android:name=".RosterActivity"
android:configChanges="locale"
android:label=""
android:theme="@style/AppTheme.Light" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/api_key" />
</application>
</manifest>
这是我的布局文件
<?xml version="1.0" encoding="utf-8"?>
<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/content_roster_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="5dp"
android:layout_marginTop="3dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".RosterActivity"
tools:showIn="@layout/app_bar_roster">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:orientation="vertical">
<com.google.android.gms.maps.MapView
android:id="@+id/roster_map_view"
android:layout_width="match_parent"
android:layout_height="300dp"
android:apiKey="xxx--yyy-zzz-aaa-www"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/roster_map_view"
android:layout_marginTop="4dp"
android:layout_marginBottom="15dp"
android:alpha="0.5"
android:background="#765491"
android:orientation="vertical">
<TextView
android:id="@+id/roster_ac_date_text"
android:layout_width="match_parent"
android:layout_height="36dp"
android:layout_gravity="center"
android:background="#563e6b"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="5 th MAY 2017"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="22sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="START TIME"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="END TIME"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/roster_st_time_text"
android:text="08.30 AM"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="20sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/roster_ed_time_text"
android:text="05.30 PM"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="20sp" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/roster_location_text"
android:layout_marginRight="35dp"
android:layout_marginLeft="35dp"
android:layout_marginTop="8dp"
android:drawablePadding="5dp"
android:drawableLeft="@drawable/ic_place_small"
android:textAlignment="center"
android:maxLines="3"
android:lines="3"
android:clickable="true"
android:textSize="14sp"
android:text="Australian Strategic Partnership\n#9, School Lane, Kollpity, Colombo 3"
android:textColor="@android:color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatButton
android:id="@+id/roster_accept_btn"
style="@style/ButtonStyle"
android:layout_height="32dp"
android:background="@color/loginColor"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="40dp"
android:textSize="16sp"
android:textStyle="bold"
android:layout_weight="1"
android:clickable="true"
android:text="ACCEPT" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/roster_reject_btn"
style="@style/ButtonStyle"
android:layout_height="32dp"
android:background="@color/acceptedPurpleColour"
android:layout_marginBottom="10dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="10dp"
android:textSize="16sp"
android:textStyle="bold"
android:clickable="true"
android:layout_weight="1"
android:text="REJECT" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</RelativeLayout>
buid.gradle(模块:app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "sec.asdf_solutions.biz.security"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.prolificinteractive:material-calendarview:1.4.3'
compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'joda-time:joda-time:2.9.4'
compile 'com.auth0.android:jwtdecode:1.1.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.google.android.gms:play-services-location:10.2.1'
compile 'com.android.support:support-annotations:24.2.0'
compile 'com.google.firebase:firebase-messaging:10.2.0'
compile 'com.google.maps:google-maps-services:0.1.20'
testCompile 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'
这是我的activity实现上述过程,
public class RosterActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
//protected MapView mMapView;
android.support.v7.widget.AppCompatButton acceptButton;
android.support.v7.widget.AppCompatButton rejectButton;
private Context context;
private String token;
private long idLong;
private Response responseBody;
TextView rosterDateTextView;
TextView rosterStartTimeTextView;
TextView rosterEndTimeTextView;
TextView rosterLocationTextView;
View mainView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roster);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_roster);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
return true;
}
}
特别说明:我没有使用MapActivity。
有什么想法吗?
Users of this class must forward all the life cycle methods from the Activity or Fragment containing this view to the corresponding ones in this class. In particular, you must forward on the following methods:
- onCreate(Bundle)
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onSaveInstanceState()
- onLowMemory()
MapFragment
或 SupportMapFragment
所做的就是将所有这些回调转发给 MapView
,因此如果您自己完成这项工作,则无需拥有特定的超类。
例如:
MapView rosterMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roster);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_roster);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
rosterMapView = (MapView) findViewById(R.id.roster_map_view);
rosterMapView.onCreate(savedInstanceState);
}
@Override
protected void onPause() {{
super.onPause();
rosterMapView.onPause();
}
等等 - 覆盖每个方法并将调用传递给您的 MapView
。
你可以试试这个 way.Also 你永远不应该 post/show 你的 API 钥匙。试着隐藏。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</Linear Layout>
//finding xml view from xml layout
GoogleMap googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
我尝试在线性布局中实现 MapView
,但此布局不属于 MapActivity
。此外,我没有使用 fragment
来实现该过程。
我还从 Google 开发人员控制台获得了一个 api 密钥,并启用了一些与位置和地图相关的 api。
这是我在 android 工作室中的 android 清单,
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="sec.asdf_solutions.biz.security">
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/logo"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".SplashScreenActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".LoginActivity"></activity>
<activity
android:name=".RosterActivity"
android:configChanges="locale"
android:label=""
android:theme="@style/AppTheme.Light" />
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/api_key" />
</application>
</manifest>
这是我的布局文件
<?xml version="1.0" encoding="utf-8"?>
<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/content_roster_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="5dp"
android:layout_marginTop="3dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".RosterActivity"
tools:showIn="@layout/app_bar_roster">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:orientation="vertical">
<com.google.android.gms.maps.MapView
android:id="@+id/roster_map_view"
android:layout_width="match_parent"
android:layout_height="300dp"
android:apiKey="xxx--yyy-zzz-aaa-www"
android:layout_weight="1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/roster_map_view"
android:layout_marginTop="4dp"
android:layout_marginBottom="15dp"
android:alpha="0.5"
android:background="#765491"
android:orientation="vertical">
<TextView
android:id="@+id/roster_ac_date_text"
android:layout_width="match_parent"
android:layout_height="36dp"
android:layout_gravity="center"
android:background="#563e6b"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="5 th MAY 2017"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="22sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="START TIME"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="14sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="END TIME"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/roster_st_time_text"
android:text="08.30 AM"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="20sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:id="@+id/roster_ed_time_text"
android:text="05.30 PM"
android:textStyle="bold"
android:textAlignment="center"
android:textColor="@android:color/white"
android:textSize="20sp" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/roster_location_text"
android:layout_marginRight="35dp"
android:layout_marginLeft="35dp"
android:layout_marginTop="8dp"
android:drawablePadding="5dp"
android:drawableLeft="@drawable/ic_place_small"
android:textAlignment="center"
android:maxLines="3"
android:lines="3"
android:clickable="true"
android:textSize="14sp"
android:text="Australian Strategic Partnership\n#9, School Lane, Kollpity, Colombo 3"
android:textColor="@android:color/white" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="18dp"
android:orientation="horizontal">
<android.support.v7.widget.AppCompatButton
android:id="@+id/roster_accept_btn"
style="@style/ButtonStyle"
android:layout_height="32dp"
android:background="@color/loginColor"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="40dp"
android:textSize="16sp"
android:textStyle="bold"
android:layout_weight="1"
android:clickable="true"
android:text="ACCEPT" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/roster_reject_btn"
style="@style/ButtonStyle"
android:layout_height="32dp"
android:background="@color/acceptedPurpleColour"
android:layout_marginBottom="10dp"
android:layout_marginLeft="40dp"
android:layout_marginRight="10dp"
android:textSize="16sp"
android:textStyle="bold"
android:clickable="true"
android:layout_weight="1"
android:text="REJECT" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</ScrollView>
</RelativeLayout>
buid.gradle(模块:app)
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '25.0.0'
defaultConfig {
applicationId "sec.asdf_solutions.biz.security"
minSdkVersion 18
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.prolificinteractive:material-calendarview:1.4.3'
compile 'com.google.android.gms:play-services-maps:10.2.1'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'joda-time:joda-time:2.9.4'
compile 'com.auth0.android:jwtdecode:1.1.0'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.google.android.gms:play-services-location:10.2.1'
compile 'com.android.support:support-annotations:24.2.0'
compile 'com.google.firebase:firebase-messaging:10.2.0'
compile 'com.google.maps:google-maps-services:0.1.20'
testCompile 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'
这是我的activity实现上述过程,
public class RosterActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
//protected MapView mMapView;
android.support.v7.widget.AppCompatButton acceptButton;
android.support.v7.widget.AppCompatButton rejectButton;
private Context context;
private String token;
private long idLong;
private Response responseBody;
TextView rosterDateTextView;
TextView rosterStartTimeTextView;
TextView rosterEndTimeTextView;
TextView rosterLocationTextView;
View mainView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roster);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_roster);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onNavigationItemSelected(MenuItem item) {
return true;
}
}
特别说明:我没有使用MapActivity。
有什么想法吗?
Users of this class must forward all the life cycle methods from the Activity or Fragment containing this view to the corresponding ones in this class. In particular, you must forward on the following methods:
- onCreate(Bundle)
- onStart()
- onResume()
- onPause()
- onStop()
- onDestroy()
- onSaveInstanceState()
- onLowMemory()
MapFragment
或 SupportMapFragment
所做的就是将所有这些回调转发给 MapView
,因此如果您自己完成这项工作,则无需拥有特定的超类。
例如:
MapView rosterMapView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_roster);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_roster);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowHomeEnabled(true);
rosterMapView = (MapView) findViewById(R.id.roster_map_view);
rosterMapView.onCreate(savedInstanceState);
}
@Override
protected void onPause() {{
super.onPause();
rosterMapView.onPause();
}
等等 - 覆盖每个方法并将调用传递给您的 MapView
。
你可以试试这个 way.Also 你永远不应该 post/show 你的 API 钥匙。试着隐藏。
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</Linear Layout>
//finding xml view from xml layout
GoogleMap googleMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();