diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9d1c6dc..b682eed 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
+
{
-// geoCode(query);
-// }).start();
-// return false;
-// }
-//
-// @Override
-// public boolean onQueryTextChange(String newText) {
-// return false;
-// }
-// });
+ // 検索バーの処理
+ SearchView searchView = findViewById(R.id.tool_search);
+ searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
+
+ //文字列を入力後にEnterなど、検索確定したとき
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ if(query == null) {
+ Toast.makeText(MapsActivity.this,
+ String.format("住所や施設名を入力してください"),
+ Toast.LENGTH_SHORT)
+ .show();
+ } else {
+ System.out.println("------検索内容---------");
+ System.out.println(query);
+ System.out.println("----------------------");
+ //mapsFragment側で地名検索,見つかった場合はその地点に画面移動
+ mapsFragment.SeachLocation(query);
+ }
+ return false;
+ }
+
+ //検索文字に変化があったとき
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ System.out.println("------文字列変化検出------");
+ System.out.println(newText);
+ System.out.println("----------------------");
+ return false;
+ }
+ });
//filterDialog = new FilterDialog();
diff --git a/app/src/main/java/com/example/nemophila/MapsFragment.java b/app/src/main/java/com/example/nemophila/MapsFragment.java
index 20e9e3d..e7b1f33 100644
--- a/app/src/main/java/com/example/nemophila/MapsFragment.java
+++ b/app/src/main/java/com/example/nemophila/MapsFragment.java
@@ -24,6 +24,7 @@
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
+import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
@@ -34,6 +35,14 @@
import android.widget.TextView;
import android.widget.Toast;
+import android.content.Context;
+import android.location.Address;
+import android.location.Geocoder;
+import android.text.TextUtils;
+import java.io.IOException;
+import java.util.List;
+import java.util.Locale;
+
import com.example.nemophila.databinding.ActivityMainBinding;
import com.example.nemophila.entities.AccountNameJson;
import com.example.nemophila.entities.Post;
@@ -43,6 +52,8 @@
import com.example.nemophila.viewmodels.ShopsViewModel;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
+import com.google.maps.*;
+import com.google.maps.model.GeocodingResult;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
@@ -67,6 +78,7 @@
Nemophila nemophila;
private GoogleMap mMap;
+ private GeoApiContext geoApiContext;
private ActivityMainBinding binding;
private LatLng currentLatlng = null;
private LatLng initialLatlng;
@@ -108,77 +120,76 @@
});
-
// 店情報の更新が入った時の処理(LiveDataへの購読)
shopsViewModel.getShopsLiveData().observe(getActivity(), shops -> {
Toast.makeText(getActivity(),
String.format("表示していない店を確認しました。ピンを立てます"),
Toast.LENGTH_SHORT)
.show();
- for (Shop shop : shops) {
- if ( shopsViewModel.getMarker(shop) == null) { //フレンド以外の投稿のピンも立てたい場合
- //各shopに対応するMarkerがなければMarkerを立てる
- shopLatlng = new LatLng(shop.getLatitude(), shop.getLongitude());
- System.out.println(shopLatlng);
- Marker createMarker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title(""));
- //マーカーに店情報を持たせる
- createMarker.setTag(shop);
+ for (Shop shop : shops) {
+ if (shopsViewModel.getMarker(shop) == null) { //フレンド以外の投稿のピンも立てたい場合
+ //各shopに対応するMarkerがなければMarkerを立てる
+ shopLatlng = new LatLng(shop.getLatitude(), shop.getLongitude());
+ System.out.println(shopLatlng);
+ Marker createMarker = mMap.addMarker(new MarkerOptions().position(shopLatlng).title(""));
+ //マーカーに店情報を持たせる
+ createMarker.setTag(shop);
- //ShopToMarkerに紐づけ
- shopsViewModel.setShopAndMarker(shop, createMarker);
- System.out.println(friendsData);
+ //ShopToMarkerに紐づけ
+ shopsViewModel.setShopAndMarker(shop, createMarker);
+ System.out.println(friendsData);
- ArrayList userIdSet = (ArrayList)shop.getUserIdSet().clone();
- friendsData.add(nemophila.getUid());
- userIdSet.retainAll(friendsData);
+ ArrayList userIdSet = (ArrayList) shop.getUserIdSet().clone();
+ friendsData.add(nemophila.getUid());
+ userIdSet.retainAll(friendsData);
- //自分とそのフレンド以外の投稿は確認しない
- if( userIdSet.size() > 0) {
- //場合分け
- //フィルターを一切かけていないとき
- if(nemophila.getSelectGenres().isEmpty() && nemophila.getSelectFriends().isEmpty()){
- createMarker.setVisible(true);
- }
- //ジャンルのみフィルターをかけているとき
- else if(nemophila.getSelectFriends().isEmpty()) {
- for(String genre : nemophila.getSelectGenres()) {
- if(shop.getGenreSet().contains(genre)) {
- createMarker.setVisible(true);
- break;
- } else {
- createMarker.setVisible(false);
- }
- }
- }
- //フレンドのみフィルターをかけているとき
- else if(nemophila.getSelectGenres().isEmpty()) {
- for(String friendId : nemophila.getSelectFriends()) {
- if(shop.getUserIdSet().contains(friendId)) {
- createMarker.setVisible(true);
- break;
- } else {
- createMarker.setVisible(false);
- }
- }
- }
- //どちらもフィルターをかけているとき
- else {
- for(String genre : nemophila.getSelectGenres()) {
- for(String friendId : nemophila.getSelectFriends()) {
- if (shop.getGenreSet().contains(genre) && shop.getUserIdSet().contains(friendId)) {
- createMarker.setVisible(true);
- break;
- } else {
- createMarker.setVisible(false);
- }
- }
- }
- }
- } else {
- createMarker.setVisible(false);
+ //自分とそのフレンド以外の投稿は確認しない
+ if (userIdSet.size() > 0) {
+ //場合分け
+ //フィルターを一切かけていないとき
+ if (nemophila.getSelectGenres().isEmpty() && nemophila.getSelectFriends().isEmpty()) {
+ createMarker.setVisible(true);
}
+ //ジャンルのみフィルターをかけているとき
+ else if (nemophila.getSelectFriends().isEmpty()) {
+ for (String genre : nemophila.getSelectGenres()) {
+ if (shop.getGenreSet().contains(genre)) {
+ createMarker.setVisible(true);
+ break;
+ } else {
+ createMarker.setVisible(false);
+ }
+ }
+ }
+ //フレンドのみフィルターをかけているとき
+ else if (nemophila.getSelectGenres().isEmpty()) {
+ for (String friendId : nemophila.getSelectFriends()) {
+ if (shop.getUserIdSet().contains(friendId)) {
+ createMarker.setVisible(true);
+ break;
+ } else {
+ createMarker.setVisible(false);
+ }
+ }
+ }
+ //どちらもフィルターをかけているとき
+ else {
+ for (String genre : nemophila.getSelectGenres()) {
+ for (String friendId : nemophila.getSelectFriends()) {
+ if (shop.getGenreSet().contains(genre) && shop.getUserIdSet().contains(friendId)) {
+ createMarker.setVisible(true);
+ break;
+ } else {
+ createMarker.setVisible(false);
+ }
+ }
+ }
+ }
+ } else {
+ createMarker.setVisible(false);
}
}
+ }
});
// 長押しを認識した後の処理(LiveDataへの購読)
@@ -188,9 +199,9 @@
Toast.LENGTH_SHORT)
.show();
- //長押し時は周辺のピンを全て取得し、ダイアログに表示する
- DialogFragment dialogFragment = new MapsDialogFragment(shops);
- dialogFragment.show(getActivity().getSupportFragmentManager(),"mapsdialog");
+ //長押し時は周辺のピンを全て取得し、ダイアログに表示する
+ DialogFragment dialogFragment = new MapsDialogFragment(shops);
+ dialogFragment.show(getActivity().getSupportFragmentManager(), "mapsdialog");
});
//初期画面の座標(現在地をロードするまで表示)
@@ -212,16 +223,16 @@
});
- // test用 座標を確認するため
- // タップした時のリスナーをセット
- mMap.setOnMapClickListener(tapLocation -> {
- // map(ピン以外)をtapされた位置の緯度経度
- tapLatlng = new LatLng(tapLocation.latitude, tapLocation.longitude);
- Toast.makeText(getActivity(),
- String.format("%s", tapLatlng),
- Toast.LENGTH_SHORT)
- .show();
- });
+ // test用 座標を確認するため
+ // タップした時のリスナーをセット
+ mMap.setOnMapClickListener(tapLocation -> {
+ // map(ピン以外)をtapされた位置の緯度経度
+ tapLatlng = new LatLng(tapLocation.latitude, tapLocation.longitude);
+ Toast.makeText(getActivity(),
+ String.format("%s", tapLatlng),
+ Toast.LENGTH_SHORT)
+ .show();
+ });
//長押し時に店を作成し、その座標にピンを立てる
@@ -237,7 +248,7 @@
//テスト用
//shopsViewModel.longClickViewArea(longpushLocation.longitude+1, longpushLocation.latitude+1, longpushLocation.longitude-1, longpushLocation.latitude-1);
//本番環境は↓の範囲で
- shopsViewModel.longClickViewArea(longpushLocation.longitude+0.001, longpushLocation.latitude+0.001, longpushLocation.longitude-0.001, longpushLocation.latitude-0.001);
+ shopsViewModel.longClickViewArea(longpushLocation.longitude + 0.001, longpushLocation.latitude + 0.001, longpushLocation.longitude - 0.001, longpushLocation.latitude - 0.001);
});
// ピンをクリックした場合
@@ -245,7 +256,7 @@
@Override
public boolean onMarkerClick(Marker marker) {
//現在地マーカーをクリックしたときのみ例外
- if(marker.getTag() == null) {
+ if (marker.getTag() == null) {
//以下の処理をストップ
return false;
}
@@ -285,8 +296,7 @@
requestPermissionLauncher.launch(
Manifest.permission.ACCESS_FINE_LOCATION);
- }
- else{
+ } else {
locationStart();
}
@@ -305,7 +315,7 @@
}
- private void zoomMap(double latitude, double longitude) {
+ public void zoomMap(double latitude, double longitude) {
// 表示する東西南北の緯度経度を設定
double south = latitude * (1 - 0.00005);
double west = longitude * (1 - 0.00005);
@@ -338,7 +348,7 @@
//初回現在地取得時
if (currentMarker == null) {
- currentMarker=mMap.addMarker(new MarkerOptions().position(current_location).title("現在地").icon(bd));
+ currentMarker = mMap.addMarker(new MarkerOptions().position(current_location).title("現在地").icon(bd));
} else {
//2回目移行
currentMarker.setPosition(current_location);
@@ -352,8 +362,7 @@
isGranted -> {
if (isGranted) {
locationStart();
- }
- else {
+ } else {
Toast toast = Toast.makeText(getActivity(),
"これ以上なにもできません", Toast.LENGTH_SHORT);
toast.show();
@@ -362,8 +371,8 @@
//現在地の取得
@SuppressLint("MissingPermission")
- private void locationStart(){
- Log.d("debug","locationStart()");
+ private void locationStart() {
+ Log.d("debug", "locationStart()");
// LocationManager インスタンス生成
locationManager =
@@ -399,7 +408,7 @@
@Override
public void onLocationChanged(Location location) {
//初期画面は現在地を中心にするため...
- if (currentLatlng == null){
+ if (currentLatlng == null) {
//↓現在地ロード後画面中心を現在地にする場合
//zoomMap(location.getLatitude(), location.getLongitude());
//ロード画面の終了
@@ -409,7 +418,7 @@
getView().findViewById(R.id.currentButton).setVisibility(View.VISIBLE);
ImageButton button1 = getView().findViewById(R.id.currentButton);
- button1.setOnClickListener( v -> {
+ button1.setOnClickListener(v -> {
Log.d("debug", "currentbutton, 現在地にカメラを移動");
System.out.println(shopsViewModel.getShopsLiveData().getValue());
//現在地にカメラを移動
@@ -422,7 +431,49 @@
currentLatlng = new LatLng(location.getLatitude(), location.getLongitude());
//現在地アイコンを表示.このsetIcon内にzoomMap処理もあるので注意
- setIcon(location.getLatitude(),location.getLongitude());
+ setIcon(location.getLatitude(), location.getLongitude());
+ }
+
+ //住所・施設名などから緯度経度を検索するメソッド
+ public void SeachLocation(String seachText) {
+ // Geocoderを使用して緯度経度を取得し移動
+ LatLng latLng = getLatLngFromAddress(seachText);
+ if (latLng != null) {
+ System.out.println("-------検索地点の座標取得完了!--------");
+ System.out.println("緯度: " + latLng.latitude + "\n経度: " + latLng.longitude);
+ System.out.println("-----------------------------------");
+
+ Toast.makeText(getActivity(),
+ String.format("該当の地点に移動します"),
+ Toast.LENGTH_SHORT)
+ .show();
+ nemophila.setZoom(18f);
+ zoomMap(latLng.latitude, latLng.longitude);
+ } else {
+ //緯度経度取得ミス
+ System.out.println("-------検索地点の座標取得失敗--------");
+ Toast.makeText(getActivity(),
+ String.format("該当の地点が見つかりませんでした"),
+ Toast.LENGTH_SHORT)
+ .show();
+ }
+ }
+
+ // 住所から緯度経度を取得するメソッド
+ private LatLng getLatLngFromAddress(String address) {
+ Geocoder geocoder = new Geocoder(requireContext(), Locale.getDefault());
+ try {
+ List addresses = geocoder.getFromLocationName(address, 1);
+ if (addresses != null && !addresses.isEmpty()) {
+ Address firstAddress = addresses.get(0);
+ double latitude = firstAddress.getLatitude();
+ double longitude = firstAddress.getLongitude();
+ return new LatLng(latitude, longitude);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
}
@Override