Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android: How to implement com.google.android.gms.maps.MapView without using a map activity

I tried to implement MapView inside a linear layout and this layout is not belong to a MapActivity. Also I didn't use a fragment to implement that process.

Also I got an api key from Google Developer Console and enable some apis which are related to Locations and Maps.

This is my android manifest 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>

This 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 for implement 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.

Have any ideas ?

like image 270
Terance Wijesuriya Avatar asked Dec 23 '22 17:12

Terance Wijesuriya


2 Answers

Per 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()

All that MapFragment or SupportMapFragment does is forward all of those callbacks to the MapView so if you do that work yourself, there is no need to have a specific superclass.

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

Etc, etc - override each method and pass the call onto your MapView.

like image 184
ianhanniballake Avatar answered Dec 26 '22 10:12

ianhanniballake


You can try this way.Also you should never post/show your API key. Try to hide.

      <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();
like image 43
Rims Avatar answered Dec 26 '22 10:12

Rims