Android: How to implement com.google.android.gms.maps.MapView without using map activities
I tried to implement MapView
in a linear layout, but this layout is not part of a MapActivity
. Also, I didn’t use fragment
to implement the process.
I also got an API key from the Google Developer Console and enabled some location- and map-related APIs.
This is my Android list in Android Studio
<?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>
Here is my layout file
<?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 (module: 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'
This is my activity to implement the above process
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;
}
}
Special note: I am not using MapActivity.
Any ideas?
Solution
According to MapView’s documentation :
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()
What MapFragment
or SupportMapFragment
does is forward all these callbacks to MapView
, so if you do the work yourself, you don’t need to have a specific parent class (super class).
For example:
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();
}
And so on – override each method and pass the call to your MapView
.