Source:
<code>private void setUpOfflineMapGeocoding() { TileCache tileCache = new TileCache(extern + getResources().getString(R.string.sandiego_tpk)); tiledLayer = new ArcGISTiledLayer(tileCache); Basemap basemap = new Basemap(tiledLayer); mMap = new ArcGISMap(basemap); mMapView.setMap(mMap); mMap.addDoneLoadingListener(new Runnable() { @Override public void run() { Point p = new Point(-117.162040, 32.718260, SpatialReference.create(4326)); Viewpoint vp = new Viewpoint(p, 10000); mMapView.setViewpointAsync(vp, 3); } }); graphicsOverlay = new GraphicsOverlay(); graphicsOverlay.setSelectionColor(Color.CYAN); mMapView.getGraphicsOverlays().add(graphicsOverlay); mGeocodeParameters = new GeocodeParameters(); mGeocodeParameters.getResultAttributeNames().add("*"); mGeocodeParameters.setMaxResults(1); BitmapDrawable startDrawable = (BitmapDrawable) ContextCompat.getDrawable(this, R.drawable.pin); mPinSourceSymbol = new PictureMarkerSymbol(startDrawable); mPinSourceSymbol.setHeight(90); mPinSourceSymbol.setWidth(20); mPinSourceSymbol.loadAsync(); mPinSourceSymbol.setLeaderOffsetY(45); <START> <END> mReverseGeocodeParameters = new ReverseGeocodeParameters(); mReverseGeocodeParameters.getResultAttributeNames().add("*"); mReverseGeocodeParameters.setOutputSpatialReference(mMap.getSpatialReference()); mReverseGeocodeParameters.setMaxResults(1); mLocatorTask = new LocatorTask(extern + getResources().getString(R.string.sandiego_loc)); mCalloutContent = new TextView(getApplicationContext()); mCalloutContent.setTextColor(Color.BLACK); mCalloutContent.setTextIsSelectable(true); }</code><technical_language>I @hardikc07 is for is .setOffsetY(-45). Keeping callout top of pin allows user drag pin reverse geocode</technical_language>

Target:
private void setUpOfflineMapGeocoding() { TileCache tileCache = new TileCache(extern + getResources().getString(R.string.sandiego_tpk)); tiledLayer = new ArcGISTiledLayer(tileCache); Basemap basemap = new Basemap(tiledLayer); mMap = new ArcGISMap(basemap); mMapView.setMap(mMap); mMap.addDoneLoadingListener(new Runnable() { @Override public void run() { Point p = new Point(-117.162040, 32.718260, SpatialReference.create(4326)); Viewpoint vp = new Viewpoint(p, 10000); mMapView.setViewpointAsync(vp, 3); } }); graphicsOverlay = new GraphicsOverlay(); graphicsOverlay.setSelectionColor(Color.CYAN); mMapView.getGraphicsOverlays().add(graphicsOverlay); mGeocodeParameters = new GeocodeParameters(); mGeocodeParameters.getResultAttributeNames().add("*"); mGeocodeParameters.setMaxResults(1); BitmapDrawable startDrawable = (BitmapDrawable) ContextCompat.getDrawable(this, R.drawable.pin); try { mPinSourceSymbol = PictureMarkerSymbol.createAsync(startDrawable).get(); mPinSourceSymbol.loadAsync(); mPinSourceSymbol.setHeight(90); mPinSourceSymbol.setWidth(20); mPinSourceSymbol.setLeaderOffsetY(45); mPinSourceSymbol.setOffsetY(-25); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } mReverseGeocodeParameters = new ReverseGeocodeParameters(); mReverseGeocodeParameters.getResultAttributeNames().add("*"); mReverseGeocodeParameters.setOutputSpatialReference(mMap.getSpatialReference()); mReverseGeocodeParameters.setMaxResults(1); mLocatorTask = new LocatorTask(extern + getResources().getString(R.string.sandiego_loc)); mCalloutContent = new TextView(getApplicationContext()); mCalloutContent.setTextColor(Color.BLACK); mCalloutContent.setTextIsSelectable(true); }