百度地图,如何实现公交线路搜索后跳转回主Activity中用MapView显示出来

本文介绍了如何在Android应用中实现公交路线查询功能,并在地图上显示查询结果,包括地图引擎初始化、公交路线搜索逻辑及跳转回主界面进行路线显示的流程。

首先我有一个MainActivity.java。和一个RoutSearch.java。我想实现从RoutSearch 输入公交路线后跳转回MainActivity进行路线的显示。

RoutSearch.java代码:

package cn.vaecer.biye.search;


import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKBusLineResult;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKPoiInfo;
import com.baidu.mapapi.MKPoiResult;
import com.baidu.mapapi.MKSearch;
import com.baidu.mapapi.MKSearchListener;
import com.baidu.mapapi.MKSuggestionResult;
import com.baidu.mapapi.MKTransitRouteResult;
import com.baidu.mapapi.MKWalkingRouteResult;
import com.baidu.mapapi.RouteOverlay;
import com.baidu.mapapi.TransitOverlay;


import cn.vaecer.biye.MainActivity;
import cn.vaecer.biye.R;
import cn.vaecer.biye.SearchActivity;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class RoutSearch extends Activity {


private Button back;
private Button routSearch;
private EditText routNumber;


private BMapManager bMapManager;// 地图引擎
private MKSearch mkSearch;


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.routsearch);


back = (Button) findViewById(R.id.back);
back.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(RoutSearch.this, SearchActivity.class);
RoutSearch.this.finish();
}
});


mkSearch = new MKSearch();
mkSearch.init(bMapManager, new MyListener());
routNumber = (EditText) findViewById(R.id.routnumber);// 输入框初始化
routSearch = (Button) findViewById(R.id.routsearchgo);
String routString = routNumber.getText().toString();
mkSearch.poiSearchInCity("福州", routString);
routSearch.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub


// Bundle bundle = new Bundle();
// // 保存要查询路线进bundle
// bundle.putString("rout", routString);
// intent.putExtras(bundle);


Intent intent = new Intent(RoutSearch.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
});


}


public class MyListener implements MKSearchListener {


public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
// TODO Auto-generated method stub
if (arg0 == null) {
return;
}
TransitOverlay transitOverlay = new TransitOverlay(RoutSearch.this,
MainActivity.mapView);
transitOverlay.setData(arg0.getPlan(0));
MainActivity.mapView.getOverlays().add(transitOverlay);
MainActivity.mapView.invalidate();
}


public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
// TODO Auto-generated method stub


}


public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
// TODO Auto-generated method stub
if (arg0 == null || arg1 != 0) {
Toast.makeText(RoutSearch.this, "对不起,未找到您需要的线路!", 1).show();
return;
}
RouteOverlay routeOverlay = new RouteOverlay(RoutSearch.this,
MainActivity.mapView);
routeOverlay.setData(arg0.getBusRoute());
MainActivity.mapView.getOverlays().clear();
MainActivity.mapView.getOverlays().add(routeOverlay);
MainActivity.mapView.invalidate();
MainActivity.mapView.getController().animateTo(
arg0.getBusRoute().getStart());
}


public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub


}


public void onGetPoiDetailSearchResult(int arg0, int arg1) {
// TODO Auto-generated method stub


}


// 获得公交线路图的UID,根據此UID發起公交線路圖的詳情
public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {
// TODO Auto-generated method stub
if (arg0 == null || arg2 != 0) {
Toast.makeText(RoutSearch.this, "对不起,未能查询到您需要的公交线路!", 1).show();
return;
}
MKPoiInfo mkPoiInfo = null;
int totalPoiNum = arg0.getNumPois();// 获得总站点
for (int i = 0; i < totalPoiNum; i++) {
mkPoiInfo = arg0.getPoi(i);
if (mkPoiInfo.ePoiType == 2) {
break;
}
}
mkSearch.busLineSearch("福州", mkPoiInfo.uid);
}


public void onGetRGCShareUrlResult(String arg0, int arg1) {
// TODO Auto-generated method stub


}


public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub


}


public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub


}


}
}

由于MainActivity代码过多,就不贴出,在其中我没有做任何的关于线路搜索的代码,只是将mapView设置成public static 的形式。

你好像越搞越乱了啊,我给你的是RoutePlanActivity的代码。最初的样子是这样的package com.example.bus; import android.os.Bundle; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.amap.api.maps.AMap; import com.amap.api.maps.MapView; import com.amap.api.services.route.BusPath; import com.amap.api.services.route.BusRouteResult; import com.amap.api.services.route.DriveRouteResult; import com.amap.api.services.route.RouteResult; import com.amap.api.services.route.RouteSearch; public class RoutePlanActivity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener { private MapView mapView; private AMap aMap; private RouteSearch routeSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_route_plan); mapView = findViewById(R.id.map_view); mapView.onCreate(savedInstanceState); if (aMap == null) aMap = mapView.getMap(); routeSearch = new RouteSearch(this); routeSearch.setRouteSearchListener(this); parseIntentAndStartSearch(); } private void parseIntentAndStartSearch() { String startMode = getIntent().getStringExtra("start_mode"); double targetLat = getIntent().getDoubleExtra("target_lat", 0); double targetLng = getIntent().getDoubleExtra("target_lng", 0); if (targetLat == 0 || targetLng == 0) { Toast.makeText(this, "目标位置无效", Toast.LENGTH_SHORT).show(); finish(); return; } // 构造目标点 com.amap.api.services.core.LatLonPoint startPoint, targetPoint; if ("my_location".equals(startMode)) { // TODO: 实际应使用定位获取“我的位置” // 这里模拟北京某坐标 startPoint = new com.amap.api.services.core.LatLonPoint(39.909186, 116.397411); } else { double startLat = getIntent().getDoubleExtra("start_lat", 0); double startLng = getIntent().getDoubleExtra("start_lng", 0); startPoint = new com.amap.api.services.core.LatLonPoint(startLat, startLng); } targetPoint = new com.amap.api.services.core.LatLonPoint(targetLat, targetLng); RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(startPoint, targetPoint); RouteSearch.BusRouteQuery query = new RouteSearch.BusRouteQuery(fromAndTo, RouteSearch.BUS_DEFAULT, "", 0); routeSearch.calculateBusRouteAsyn(query); } @Override public void onBusRouteSearched(BusRouteResult result, int rCode) { if (rCode == 1000 && result != null && result.getPaths() != null && !result.getPaths().isEmpty()) { BusPath best = result.getPaths().get(0); Toast.makeText(this, "推荐路线:" + best.getDuration() / 60 + "分钟,步行" + best.getWalkDistance() + "米", Toast.LENGTH_LONG).show(); // TODO: 绘制路线(后续可加 Polyline 或 RouteOverlay) } else { Toast.makeText(this, "未找到公交路线", Toast.LENGTH_SHORT).show(); } } @Override public void onDriveRouteSearched(DriveRouteResult result, int rCode) {} @Override protected void onResume() { mapView.onResume(); super.onResume(); } @Override protected void onPause() { mapView.onPause(); super.onPause(); } @Override protected void onDestroy() { mapView.onDestroy(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { mapView.onSaveInstanceState(outState); super.onSaveInstanceState(outState); } } 你结合一下上下文看看,我正在做个公交查询系统,刚刚没跟你说完多久,希望在home跟map界面实现搜索功能。home的搜索跳转到界面1,用户点击到这去跳转到界面2,map的搜索是既有起点又有终点的,直接跳转到界面2,好像问久了之后你都脱离上下文了
11-04
等一下,现在越改越乱了。我们先到初始的代码:package com.example.bus; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.amap.api.maps.AMap; import com.amap.api.maps.MapView; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.PolylineOptions; import com.amap.api.services.core.AMapException; import com.amap.api.services.core.LatLonPoint; import com.amap.api.services.route.*; import com.amap.api.services.route.BusRouteResult; import com.amap.api.services.route.RouteSearch; import java.util.ArrayList; import java.util.List; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.model.LatLngBounds; import com.amap.api.services.route.BusPath; public class RoutePlanActivity extends AppCompatActivity implements RouteSearch.OnRouteSearchListener { private MapView mapView; private AMap aMap; private RouteSearch routeSearch; private RecyclerView recyclerSteps; private boolean isSearching = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_route_plan); mapView = findViewById(R.id.map_view); recyclerSteps = findViewById(R.id.recycler_steps); mapView.onCreate(savedInstanceState); if (aMap == null) { aMap = mapView.getMap(); } try { routeSearch = new RouteSearch(this); } catch (AMapException e) { throw new RuntimeException(e); } routeSearch.setRouteSearchListener(this); parseIntentAndStartSearch(); } private void parseIntentAndStartSearch() { if (isSearching) return; double targetLat = getIntent().getDoubleExtra("target_lat", 0); double targetLng = getIntent().getDoubleExtra("target_lng", 0); if (targetLat == 0 || targetLng == 0) { Toast.makeText(this, "目标位置无效", Toast.LENGTH_SHORT).show(); finish(); return; } // 起点:模拟当前位置 LatLonPoint start = new LatLonPoint(39.909186, 116.397411); // 北京 LatLonPoint target = new LatLonPoint(targetLat, targetLng); RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(start, target); RouteSearch.BusRouteQuery query = new RouteSearch.BusRouteQuery(fromAndTo, RouteSearch.BUS_DEFAULT, "全国", 0); query.setCityd("全国"); // 支持跨城 isSearching = true; routeSearch.calculateBusRouteAsyn(query); // ✅ 此方法不抛异常,无需 try-catch } @Override public void onBusRouteSearched(BusRouteResult result, int rCode) { isSearching = false; if (rCode != 1000 || result == null || result.getPaths().isEmpty()) { Toast.makeText(this, "未找到公交路线", Toast.LENGTH_SHORT).show(); finish(); return; } BusPath bestPath = result.getPaths().get(0); // ✅ 手动绘制路线(替代 BusRouteOverlay) drawRouteOnMap(bestPath); // 显示换乘步骤 StepAdapter adapter = new StepAdapter(bestPath.getSteps()); recyclerSteps.setLayoutManager(new LinearLayoutManager(this)); recyclerSteps.setAdapter(adapter); // 显示总时间和票价 String info = String.format("耗时:%d分钟 | 票价:¥%.2f", bestPath.getDuration() / 60, bestPath.getCost()); Toast.makeText(this, info, Toast.LENGTH_LONG).show(); } /** * 手动绘制公交路线 Polyline */ private void drawRouteOnMap(BusPath path) { aMap.clear(); List<LatLng> allPoints = new ArrayList<>(); for (BusStep step : path.getSteps()) { boolean added = false; // 1. 【公交】尝试通过反射获取 getPolyline() if (step.getBusLine() != null) { try { java.lang.reflect.Method method = step.getBusLine().getClass().getMethod("getPolyline"); Object result = method.invoke(step.getBusLine()); if (result instanceof java.util.List) { for (Object obj : (java.util.List<?>) result) { if (obj instanceof LatLonPoint) { LatLonPoint point = (LatLonPoint) obj; allPoints.add(new LatLng(point.getLatitude(), point.getLongitude())); added = true; } } } } catch (Exception e) { Log.d("RoutePlan", "BusLine.getPolyline() 不可用: " + e.getMessage()); } } // 2. 【步行】反射获取 walk polyline if (!added && step.getWalk() != null) { try { java.lang.reflect.Method method = step.getWalk().getClass().getMethod("getPolyline"); Object result = method.invoke(step.getWalk()); if (result instanceof java.util.List) { for (Object obj : (java.util.List<?>) result) { if (obj instanceof LatLonPoint) { LatLonPoint point = (LatLonPoint) obj; allPoints.add(new LatLng(point.getLatitude(), point.getLongitude())); added = true; } } } } catch (Exception e) { Log.d("RoutePlan", "WalkPath.getPolyline() 不可用: " + e.getMessage()); } } // 3. 【地铁/换乘】使用 getEntrance() 和 getExit() -> Doorway -> LatLonPoint if (!added) { Doorway entrance = step.getEntrance(); // 返 Doorway! Doorway exit = step.getExit(); // 返 Doorway! if (entrance != null && entrance.getLatLonPoint() != null) { LatLonPoint p = entrance.getLatLonPoint(); allPoints.add(new LatLng(p.getLatitude(), p.getLongitude())); added = true; } if (exit != null && exit.getLatLonPoint() != null) { LatLonPoint p = exit.getLatLonPoint(); allPoints.add(new LatLng(p.getLatitude(), p.getLongitude())); added = true; } if (added) { Log.d("RoutePlan", "使用 Doorway 坐标近似绘制路段"); } } } // === 绘制折线 === if (!allPoints.isEmpty()) { PolylineOptions options = new PolylineOptions() .addAll(allPoints) .color(0xFF4A90E2) .width(12f) .geodesic(false); aMap.addPolyline(options); // 聚焦地图 LatLngBounds.Builder builder = new LatLngBounds.Builder(); for (LatLng latLng : allPoints) { builder.include(latLng); } try { LatLngBounds bounds = builder.build(); aMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100)); } catch (Exception e) { Log.e("RoutePlan", "边界计算失败", e); } } else { Toast.makeText(this, "无法获取路线坐标", Toast.LENGTH_SHORT).show(); } } // 其他不需要处理的回调 @Override public void onDriveRouteSearched(DriveRouteResult r, int c) {} @Override public void onWalkRouteSearched(WalkRouteResult r, int c) {} @Override public void onRideRouteSearched(RideRouteResult r, int c) {} // 生命周期方法保持不变 @Override protected void onResume() { mapView.onResume(); super.onResume(); } @Override protected void onPause() { mapView.onPause(); super.onPause(); } @Override protected void onDestroy() { if (mapView != null) mapView.onDestroy(); if (routeSearch != null) routeSearch.setRouteSearchListener(null); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } } 你应该还记得上下文吧,我给你提供的各部分代码,整个项目的框架以及我要实现的功能?是的,现在从头开始,刚刚越改越多报错
11-15
我刚刚说了提供完整代码即可,我目前的MapFragment代码如下:package com.example.bus.ui.map; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.Editable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.amap.api.services.core.AMapException; // 已导入 ✅ import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.MapView; import com.amap.api.maps.UiSettings; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.amap.api.services.core.PoiItem; import com.amap.api.services.poisearch.PoiResult; import com.amap.api.services.poisearch.PoiSearch; import com.amap.api.services.help.Inputtips; import com.amap.api.services.help.Tip; import com.example.bus.R; import com.example.bus.RoutePlanActivity; import com.example.bus.ResultAdapter; import com.example.bus.databinding.FragmentMapBinding; import java.util.ArrayList; import java.util.List; public class MapFragment extends Fragment implements PoiSearch.OnPoiSearchListener { private FragmentMapBinding binding; private MapView mapView; private AMap aMap; private Inputtips inputTips; // 数据 private List<PoiItem> poiList = new ArrayList<>(); private ResultAdapter adapter; private PoiSearch poiSearch; // 当前阶段:1=选择起点, 2=选择终点 private int selectionStage = 0; // 缓存已选 POI private PoiItem selectedStartPoi = null; private PoiItem selectedEndPoi = null; private Marker startMarker = null; private Marker endMarker = null; // 缓存关键词,用于智能判断 private String lastStartKeyword = ""; private String lastEndKeyword = ""; private static final int LOCATION_PERMISSION_REQUEST_CODE = 1001; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentMapBinding.inflate(inflater, container, false); View root = binding.getRoot(); mapView = binding.mapView; mapView.onCreate(savedInstanceState); initViews(); setupMap(savedInstanceState); setupSearchSuggestion(); return root; } private void initViews() { // 初始化 RecyclerView adapter = new ResultAdapter(poiList, this::onPoiItemSelected); binding.resultList.setLayoutManager(new LinearLayoutManager(requireContext())); binding.resultList.setAdapter(adapter); // 设置搜索按钮点击事件 binding.mapSearch.setOnClickListener(v -> performSearch()); // 切换按钮 binding.btnSwitchTarget.setOnClickListener(v -> { if (selectionStage == 1) { showEndpointSelection(binding.mapInput2.getText().toString().trim()); } else if (selectionStage == 2) { showStartpointSelection(binding.mapInput1.getText().toString().trim()); } }); // “到这去” binding.btnGoTo.setOnClickListener(v -> { if (selectedStartPoi != null && selectedEndPoi != null) { Intent intent = new Intent(requireContext(), RoutePlanActivity.class); intent.putExtra(RoutePlanActivity.EXTRA_SOURCE, RoutePlanActivity.SOURCE_FROM_MAP_DIRECT); intent.putExtra("start_lat", selectedStartPoi.getLatLonPoint().getLatitude()); intent.putExtra("start_lng", selectedStartPoi.getLatLonPoint().getLongitude()); intent.putExtra("target_lat", selectedEndPoi.getLatLonPoint().getLatitude()); intent.putExtra("target_lng", selectedEndPoi.getLatLonPoint().getLongitude()); intent.putExtra("target_title", selectedEndPoi.getTitle()); startActivity(intent); } else { Toast.makeText(requireContext(), "请完成起点和终点的选择", Toast.LENGTH_SHORT).show(); } }); } private void performSearch() { String startKeyword = binding.mapInput1.getText().toString().trim(); String endKeyword = binding.mapInput2.getText().toString().trim(); if (startKeyword.isEmpty()) { Toast.makeText(requireContext(), "请输入起点", Toast.LENGTH_SHORT).show(); return; } if (endKeyword.isEmpty()) { Toast.makeText(requireContext(), "请输入终点", Toast.LENGTH_SHORT).show(); return; } // 智能判断:是否可以直接跳转? if (startKeyword.equals(lastStartKeyword) && endKeyword.equals(lastEndKeyword) && selectedStartPoi != null && selectedEndPoi != null) { // 所有信息完整 → 直接跳转(等同于“到这去”) binding.btnGoTo.performClick(); return; } // 展示 UI binding.containerResultList.setVisibility(View.VISIBLE); binding.buttonGroup.setVisibility(View.VISIBLE); // 如果只有起点变了 → 选择起点 if (!startKeyword.equals(lastStartKeyword)) { lastStartKeyword = startKeyword; lastEndKeyword = endKeyword; showStartpointSelection(startKeyword); } // 如果只有终点变了 → 进入选择终点 else if (!endKeyword.equals(lastEndKeyword)) { lastEndKeyword = endKeyword; showEndpointSelection(endKeyword); } // 否则:一个为空一个不为空,按流程走 else if (selectedStartPoi == null) { showStartpointSelection(startKeyword); } else { showEndpointSelection(endKeyword); } } private void showStartpointSelection(String keyword) { selectionStage = 1; binding.btnSwitchTarget.setText("前往选择终点"); binding.btnGoTo.setEnabled(false); binding.emptyView.setText("👉 请点击选择起点"); binding.emptyView.setVisibility(View.VISIBLE); binding.resultList.setVisibility(View.GONE); doSearch(keyword); } private void showEndpointSelection(String keyword) { selectionStage = 2; binding.btnSwitchTarget.setText("选择起点"); binding.btnGoTo.setEnabled(selectedStartPoi != null); binding.emptyView.setText("👉 请点击选择终点"); binding.emptyView.setVisibility(View.VISIBLE); binding.resultList.setVisibility(View.GONE); doSearch(keyword); } private void doSearch(String keyword) { if (keyword.isEmpty()) return; PoiSearch.Query query = new PoiSearch.Query(keyword, "", "全国"); query.setPageSize(20); query.setPageNum(0); try { poiSearch = new PoiSearch(requireContext(), query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(requireContext(), "搜索失败", Toast.LENGTH_SHORT).show(); } } private void onPoiItemSelected(PoiItem item) { LatLng latLng = new LatLng(item.getLatLonPoint().getLatitude(), item.getLatLonPoint().getLongitude()); if (selectionStage == 1) { if (startMarker != null) startMarker.remove(); startMarker = aMap.addMarker(new MarkerOptions() .position(latLng) .title("起点:" + item.getTitle())); selectedStartPoi = item; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14f)); // 自动进入第二阶段 String keyword = binding.mapInput2.getText().toString().trim(); showEndpointSelection(keyword); } else if (selectionStage == 2) { if (endMarker != null) endMarker.remove(); endMarker = aMap.addMarker(new MarkerOptions() .position(latLng) .title("终点:" + item.getTitle())); selectedEndPoi = item; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14f)); binding.btnGoTo.setEnabled(true); } } @Override public void onPoiSearched(PoiResult result, int rCode) { requireActivity().runOnUiThread(() -> { if (rCode == 1000 && result != null && !result.getPois().isEmpty()) { List<PoiItem> newList = result.getPois(); poiList.clear(); poiList.addAll(newList); adapter.notifyDataSetChanged(); binding.emptyView.setVisibility(View.GONE); binding.resultList.setVisibility(View.VISIBLE); } else { handleSearchError(rCode); binding.resultList.setVisibility(View.GONE); binding.emptyView.setVisibility(View.VISIBLE); binding.emptyView.setText("⚠️ 未找到相关地点"); } }); } @Override public void onPoiItemSearched(PoiItem item, int rCode) {} private void setupMap(Bundle savedInstanceState) { mapView.onCreate(savedInstanceState); aMap = mapView.getMap(); if (aMap != null) { initMapSettings(); } else { waitAMapReady(); } } private void waitAMapReady() { new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { int retry = 0; @Override public void run() { if (mapView == null) return; aMap = mapView.getMap(); if (aMap != null) { initMapSettings(); } else if (retry++ < 50) { new Handler(Looper.getMainLooper()).postDelayed(this, 200); } } }, 200); } private void initMapSettings() { UiSettings uiSettings = aMap.getUiSettings(); uiSettings.setZoomControlsEnabled(true); uiSettings.setCompassEnabled(true); uiSettings.setScrollGesturesEnabled(true); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(39.909186, 116.397411), 10f)); } private void setupSearchSuggestion() { // 初始化 Inputtips try { inputTips = new Inputtips(requireContext(), new Inputtips.InputtipsListener() { @Override public void onGetInputtips(List<Tip> tipList, int rCode) { if (rCode == 1000 && tipList != null && !tipList.isEmpty()) { String[] arr = new String[tipList.size()]; for (int i = 0; i < tipList.size(); i++) { arr[i] = tipList.get(i).getName(); } ArrayAdapter<String> adapter = new ArrayAdapter<>( requireContext(), android.R.layout.simple_dropdown_item_1line, arr ); requireActivity().runOnUiThread(() -> { if (requireActivity().getCurrentFocus() == binding.mapInput1) { binding.mapInput1.setAdapter(adapter); } else if (requireActivity().getCurrentFocus() == binding.mapInput2) { binding.mapInput2.setAdapter(adapter); } }); } else { requireActivity().runOnUiThread(() -> { binding.mapInput1.setAdapter(null); binding.mapInput2.setAdapter(null); }); handleSearchError(rCode); } } }); } catch (Exception e) { e.printStackTrace(); Toast.makeText(requireContext(), "智能提示初始化失败", Toast.LENGTH_SHORT).show(); } Handler handler = new Handler(Looper.getMainLooper()); Runnable[] pending1 = {null}, pending2 = {null}; // 输入框1监听 —— 已添加 try-catch 处理 AMapException binding.mapInput1.addTextChangedListener(new SimpleTextWatcher(s -> { if (pending1[0] != null) handler.removeCallbacks(pending1[0]); if (s.length() == 0) { binding.mapInput1.setAdapter(null); } else { pending1[0] = () -> { try { inputTips.requestInputtips(s.toString(), "全国"); } catch (AMapException e) { e.printStackTrace(); // 可选:调试时提示 // Toast.makeText(requireContext(), "建议请求失败", Toast.LENGTH_SHORT).show(); } }; handler.postDelayed(pending1[0], 600); } })); // 输入框2监听 —— 已添加 try-catch 处理 AMapException binding.mapInput2.addTextChangedListener(new SimpleTextWatcher(s -> { if (pending2[0] != null) handler.removeCallbacks(pending2[0]); if (s.length() == 0) { binding.mapInput2.setAdapter(null); } else { pending2[0] = () -> { try { inputTips.requestInputtips(s.toString(), "全国"); } catch (AMapException e) { e.printStackTrace(); } }; handler.postDelayed(pending2[0], 600); } })); } private void handleSearchError(int rCode) { String msg; switch (rCode) { case 12: msg = "API Key 错误"; break; case 27: msg = "网络连接失败"; break; case 30: msg = "SHA1 或包名错误"; break; case 33: msg = "请求频繁"; break; default: msg = "搜索失败: " + rCode; break; } Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onResume() { super.onResume(); mapView.onResume(); enableMyLocationLayer(); } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); mapView.onDestroy(); inputTips = null; binding = null; } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } private void enableMyLocationLayer() { if (aMap == null) return; if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { aMap.setMyLocationEnabled(true); } else { ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (aMap != null) aMap.setMyLocationEnabled(true); } } } private static class SimpleTextWatcher implements android.text.TextWatcher { private final java.util.function.Consumer<CharSequence> onTextChanged; public SimpleTextWatcher(java.util.function.Consumer<CharSequence> onTextChanged) { this.onTextChanged = onTextChanged; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void afterTextChanged(Editable s) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { onTextChanged.accept(s); } } } 请你按照刚刚的思路,对这个部分进行修改,其它已有功能保持不变
11-28
目前.xml代码如下:<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".ui.map.MapFragment" android:fitsSystemWindows="true" android:layout_marginTop="?attr/actionBarSize"> <!-- 🔹 起点输入框 --> <AutoCompleteTextView android:id="@+id/map_input1" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入起点" android:textColorHint="#777777" android:textColor="@color/black" android:textSize="14sp" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" /> <!-- 🔹 终点输入框 --> <AutoCompleteTextView android:id="@+id/map_input2" android:layout_width="0dp" android:layout_height="48dp" android:hint="请输入终点" android:textColorHint="#777777" android:textColor="@color/black" android:textSize="14sp" android:background="@drawable/rounded_edittext" android:padding="12dp" android:layout_marginStart="16dp" android:layout_marginEnd="8dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@id/guideline_search" app:layout_constraintTop_toBottomOf="@id/map_input1" app:layout_constraintVertical_bias="0" /> <!-- 分割线:75% 处 --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_search" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" app:layout_constraintGuide_percent="0.75" /> <!-- 🔍 搜索按钮 --> <Button android:id="@+id/map_search" android:layout_width="0dp" android:layout_height="0dp" android:text="搜索" android:textSize="16sp" app:layout_constraintStart_toStartOf="@id/guideline_search" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/map_input1" app:layout_constraintBottom_toBottomOf="@id/map_input2" android:layout_marginEnd="16dp" /> <!-- 🗺️ 地图视图:动态 bottom 约束 --> <com.amap.api.maps.MapView android:id="@+id/map_view" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/map_input2" app:layout_constraintBottom_toTopOf="@id/container_result_list" android:layout_marginTop="4dp" /> <!-- ====== 指南线:用于精确百分比定位 ====== --> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_60" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.60" /> <androidx.constraintlayout.widget.Guideline android:id="@+id/guideline_90" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintGuide_percent="0.90" /> <!-- 🔲 固定容器包裹列表 --> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/container_result_list" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintTop_toTopOf="@id/guideline_60" app:layout_constraintBottom_toTopOf="@id/guideline_90" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:layout_marginHorizontal="16dp" android:visibility="gone"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/result_list" android:layout_width="0dp" android:layout_height="0dp" android:nestedScrollingEnabled="false" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:scrollbars="vertical" android:scrollbarThumbVertical="@drawable/custom_scrollbar_thumb" android:scrollbarTrackVertical="@drawable/custom_scrollbar_track" /> <TextView android:id="@+id/empty_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="👉 请点击选择起点" android:textColor="#007AFF" android:textSize="16sp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> <!-- 按钮组 --> <LinearLayout android:id="@+id/button_group" android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_margin="16dp" app:layout_constraintTop_toBottomOf="@id/container_result_list" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:visibility="gone"> <Button android:id="@+id/btn_switch_target" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginEnd="8dp" android:text="前往选择终点" android:textSize="14sp" /> <Button android:id="@+id/btn_go_to" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginStart="8dp" android:text="到这去" android:textSize="14sp" android:enabled="false" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout> .java代码如下:package com.example.bus.ui.map; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.text.Editable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.amap.api.services.core.AMapException; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; // 👉 新增导入:用于动态修改约束 import androidx.constraintlayout.widget.ConstraintSet; import androidx.constraintlayout.widget.ConstraintLayout; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; import com.amap.api.maps.MapView; import com.amap.api.maps.UiSettings; import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.Marker; import com.amap.api.maps.model.MarkerOptions; import com.amap.api.services.core.PoiItem; import com.amap.api.services.poisearch.PoiResult; import com.amap.api.services.poisearch.PoiSearch; import com.amap.api.services.help.Inputtips; import com.amap.api.services.help.Tip; import com.example.bus.R; import com.example.bus.RoutePlanActivity; import com.example.bus.ResultAdapter; import com.example.bus.databinding.FragmentMapBinding; import java.util.ArrayList; import java.util.List; public class MapFragment extends Fragment implements PoiSearch.OnPoiSearchListener { private FragmentMapBinding binding; private MapView mapView; private AMap aMap; private Inputtips inputTips; // 数据 private List<PoiItem> poiList = new ArrayList<>(); private ResultAdapter adapter; private PoiSearch poiSearch; // 当前阶段:1=选择起点, 2=选择终点 private int selectionStage = 0; // 缓存已选 POI private PoiItem selectedStartPoi = null; private PoiItem selectedEndPoi = null; private Marker startMarker = null; private Marker endMarker = null; // 缓存关键词,用于智能判断 private String lastStartKeyword = ""; private String lastEndKeyword = ""; private static final int LOCATION_PERMISSION_REQUEST_CODE = 1001; // 👉 新增:记录面板是否已展开(用于首次设置约束) private boolean isResultPanelShown = false; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = FragmentMapBinding.inflate(inflater, container, false); View root = binding.getRoot(); mapView = binding.mapView; mapView.onCreate(savedInstanceState); initViews(); setupMap(savedInstanceState); setupSearchSuggestion(); return root; } private void initViews() { // 初始化 RecyclerView adapter = new ResultAdapter(poiList, this::onPoiItemSelected); binding.resultList.setLayoutManager(new LinearLayoutManager(requireContext())); binding.resultList.setAdapter(adapter); // 设置搜索按钮点击事件 binding.mapSearch.setOnClickListener(v -> performSearch()); // 切换按钮 binding.btnSwitchTarget.setOnClickListener(v -> { if (selectionStage == 1) { showEndpointSelection(binding.mapInput2.getText().toString().trim()); } else if (selectionStage == 2) { showStartpointSelection(binding.mapInput1.getText().toString().trim()); } }); // “到这去” binding.btnGoTo.setOnClickListener(v -> { if (selectedStartPoi != null && selectedEndPoi != null) { Intent intent = new Intent(requireContext(), RoutePlanActivity.class); intent.putExtra(RoutePlanActivity.EXTRA_SOURCE, RoutePlanActivity.SOURCE_FROM_MAP_DIRECT); intent.putExtra("start_lat", selectedStartPoi.getLatLonPoint().getLatitude()); intent.putExtra("start_lng", selectedStartPoi.getLatLonPoint().getLongitude()); intent.putExtra("target_lat", selectedEndPoi.getLatLonPoint().getLatitude()); intent.putExtra("target_lng", selectedEndPoi.getLatLonPoint().getLongitude()); intent.putExtra("target_title", selectedEndPoi.getTitle()); startActivity(intent); } else { Toast.makeText(requireContext(), "请完成起点和终点的选择", Toast.LENGTH_SHORT).show(); } }); } private void performSearch() { String startKeyword = binding.mapInput1.getText().toString().trim(); String endKeyword = binding.mapInput2.getText().toString().trim(); if (startKeyword.isEmpty()) { Toast.makeText(requireContext(), "请输入起点", Toast.LENGTH_SHORT).show(); return; } if (endKeyword.isEmpty()) { Toast.makeText(requireContext(), "请输入终点", Toast.LENGTH_SHORT).show(); return; } // 智能判断:是否可以直接跳转? if (startKeyword.equals(lastStartKeyword) && endKeyword.equals(lastEndKeyword) && selectedStartPoi != null && selectedEndPoi != null) { // 所有信息完整 → 直接跳转(等同于“到这去”) binding.btnGoTo.performClick(); return; } // 展示 UI binding.containerResultList.setVisibility(View.VISIBLE); binding.buttonGroup.setVisibility(View.VISIBLE); // 👇 关键修改:首次显示时,应用新的约束(map_view bottom 对齐到 container_result_list 顶部) if (!isResultPanelShown) { ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone((ConstraintLayout) binding.getRoot()); constraintSet.applyTo((ConstraintLayout) binding.getRoot()); isResultPanelShown = true; } // 如果只有起点变了 → 选择起点 if (!startKeyword.equals(lastStartKeyword)) { lastStartKeyword = startKeyword; lastEndKeyword = endKeyword; showStartpointSelection(startKeyword); } // 如果只有终点变了 → 进入选择终点 else if (!endKeyword.equals(lastEndKeyword)) { lastEndKeyword = endKeyword; showEndpointSelection(endKeyword); } // 否则:一个为空一个不为空,按流程走 else if (selectedStartPoi == null) { showStartpointSelection(startKeyword); } else { showEndpointSelection(endKeyword); } } private void showStartpointSelection(String keyword) { selectionStage = 1; binding.btnSwitchTarget.setText("前往选择终点"); binding.btnGoTo.setEnabled(false); binding.emptyView.setText("👉 请点击选择起点"); binding.emptyView.setVisibility(View.VISIBLE); binding.resultList.setVisibility(View.GONE); doSearch(keyword); } private void showEndpointSelection(String keyword) { selectionStage = 2; binding.btnSwitchTarget.setText("选择起点"); binding.btnGoTo.setEnabled(selectedStartPoi != null); binding.emptyView.setText("👉 请点击选择终点"); binding.emptyView.setVisibility(View.VISIBLE); binding.resultList.setVisibility(View.GONE); doSearch(keyword); } private void doSearch(String keyword) { if (keyword.isEmpty()) return; PoiSearch.Query query = new PoiSearch.Query(keyword, "", "全国"); query.setPageSize(20); query.setPageNum(0); try { poiSearch = new PoiSearch(requireContext(), query); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); } catch (Exception e) { e.printStackTrace(); Toast.makeText(requireContext(), "搜索失败", Toast.LENGTH_SHORT).show(); } } private void onPoiItemSelected(PoiItem item) { LatLng latLng = new LatLng(item.getLatLonPoint().getLatitude(), item.getLatLonPoint().getLongitude()); if (selectionStage == 1) { if (startMarker != null) startMarker.remove(); startMarker = aMap.addMarker(new MarkerOptions() .position(latLng) .title("起点:" + item.getTitle())); selectedStartPoi = item; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14f)); // 自动进入第二阶段 String keyword = binding.mapInput2.getText().toString().trim(); showEndpointSelection(keyword); } else if (selectionStage == 2) { if (endMarker != null) endMarker.remove(); endMarker = aMap.addMarker(new MarkerOptions() .position(latLng) .title("终点:" + item.getTitle())); selectedEndPoi = item; aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 14f)); binding.btnGoTo.setEnabled(true); } } @Override public void onPoiSearched(PoiResult result, int rCode) { requireActivity().runOnUiThread(() -> { if (rCode == 1000 && result != null && !result.getPois().isEmpty()) { List<PoiItem> newList = result.getPois(); poiList.clear(); poiList.addAll(newList); adapter.notifyDataSetChanged(); binding.emptyView.setVisibility(View.GONE); binding.resultList.setVisibility(View.VISIBLE); } else { handleSearchError(rCode); binding.resultList.setVisibility(View.GONE); binding.emptyView.setVisibility(View.VISIBLE); binding.emptyView.setText("⚠️ 未找到相关地点"); } }); } @Override public void onPoiItemSearched(PoiItem item, int rCode) {} private void setupMap(Bundle savedInstanceState) { mapView.onCreate(savedInstanceState); aMap = mapView.getMap(); if (aMap != null) { initMapSettings(); } else { waitAMapReady(); } } private void waitAMapReady() { new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { int retry = 0; @Override public void run() { if (mapView == null) return; aMap = mapView.getMap(); if (aMap != null) { initMapSettings(); } else if (retry++ < 50) { new Handler(Looper.getMainLooper()).postDelayed(this, 200); } } }, 200); } private void initMapSettings() { UiSettings uiSettings = aMap.getUiSettings(); uiSettings.setZoomControlsEnabled(true); uiSettings.setCompassEnabled(true); uiSettings.setScrollGesturesEnabled(true); aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(39.909186, 116.397411), 10f)); } private void setupSearchSuggestion() { // 初始化 Inputtips try { inputTips = new Inputtips(requireContext(), new Inputtips.InputtipsListener() { @Override public void onGetInputtips(List<Tip> tipList, int rCode) { if (rCode == 1000 && tipList != null && !tipList.isEmpty()) { String[] arr = new String[tipList.size()]; for (int i = 0; i < tipList.size(); i++) { arr[i] = tipList.get(i).getName(); } ArrayAdapter<String> adapter = new ArrayAdapter<>( requireContext(), android.R.layout.simple_dropdown_item_1line, arr ); requireActivity().runOnUiThread(() -> { if (requireActivity().getCurrentFocus() == binding.mapInput1) { binding.mapInput1.setAdapter(adapter); } else if (requireActivity().getCurrentFocus() == binding.mapInput2) { binding.mapInput2.setAdapter(adapter); } }); } else { requireActivity().runOnUiThread(() -> { binding.mapInput1.setAdapter(null); binding.mapInput2.setAdapter(null); }); handleSearchError(rCode); } } }); } catch (Exception e) { e.printStackTrace(); Toast.makeText(requireContext(), "智能提示初始化失败", Toast.LENGTH_SHORT).show(); } Handler handler = new Handler(Looper.getMainLooper()); Runnable[] pending1 = {null}, pending2 = {null}; // 输入框1监听 —— 已添加 try-catch 处理 AMapException binding.mapInput1.addTextChangedListener(new SimpleTextWatcher(s -> { if (pending1[0] != null) handler.removeCallbacks(pending1[0]); if (s.length() == 0) { binding.mapInput1.setAdapter(null); } else { pending1[0] = () -> { try { inputTips.requestInputtips(s.toString(), "全国"); } catch (AMapException e) { e.printStackTrace(); } }; handler.postDelayed(pending1[0], 600); } })); // 输入框2监听 —— 已添加 try-catch 处理 AMapException binding.mapInput2.addTextChangedListener(new SimpleTextWatcher(s -> { if (pending2[0] != null) handler.removeCallbacks(pending2[0]); if (s.length() == 0) { binding.mapInput2.setAdapter(null); } else { pending2[0] = () -> { try { inputTips.requestInputtips(s.toString(), "全国"); } catch (AMapException e) { e.printStackTrace(); } }; handler.postDelayed(pending2[0], 600); } })); } private void handleSearchError(int rCode) { String msg; switch (rCode) { case 12: msg = "API Key 错误"; break; case 27: msg = "网络连接失败"; break; case 30: msg = "SHA1 或包名错误"; break; case 33: msg = "请求频繁"; break; default: msg = "搜索失败: " + rCode; break; } Toast.makeText(requireContext(), msg, Toast.LENGTH_SHORT).show(); } @Override public void onResume() { super.onResume(); mapView.onResume(); enableMyLocationLayer(); } @Override public void onPause() { super.onPause(); mapView.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); mapView.onDestroy(); inputTips = null; binding = null; } @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); mapView.onSaveInstanceState(outState); } private void enableMyLocationLayer() { if (aMap == null) return; if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { aMap.setMyLocationEnabled(true); } else { ActivityCompat.requestPermissions(requireActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_REQUEST_CODE); } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == LOCATION_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { if (aMap != null) aMap.setMyLocationEnabled(true); } } } private static class SimpleTextWatcher implements android.text.TextWatcher { private final java.util.function.Consumer<CharSequence> onTextChanged; public SimpleTextWatcher(java.util.function.Consumer<CharSequence> onTextChanged) { this.onTextChanged = onTextChanged; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override public void afterTextChanged(Editable s) {} @Override public void onTextChanged(CharSequence s, int start, int before, int count) { onTextChanged.accept(s); } } } 请你仅针对这一个问题进行修改,其它已有内容保持不变,为我提供修改后的完整.xml和.java代码
最新发布
11-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值