【问题标题】:How to put google map on the tab fragment?如何将谷歌地图放在标签片段上?
【发布时间】:2017-04-19 23:19:02
【问题描述】:

我已经创建了带有 2 个选项卡的主要活动,并且我正在尝试在第一个选项卡片段上实现地图。应用程序显示默认地图,市场位于 (0, 0),但当我单击按钮从文本框中查找新位置时它崩溃。 OneFragment java 代码:

public class OneFragment extends Fragment implements OnMapReadyCallback, View.OnClickListener{ // implements OnMapReadyCallback, View.OnClickListener

private GoogleMap mMap;
private EditText mOriginPlace;
private Button mSearchOriginButton;
private View mView;


    public OneFragment() {
        // Required empty public constructor
    }


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onMapReady(GoogleMap googleMap) { //when map service started
    mMap = googleMap;
    LatLng hcmus = new LatLng(10.762963, 106.682394); //create position with latitude and longitude
    mMap.addMarker(new MarkerOptions()
            .position(hcmus)
            .title("Title"));
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(hcmus, 10));
}


@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    setUpMapIfNeeded();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    mView = inflater.inflate(R.layout.fragment_one, container, false);

    mSearchOriginButton = (Button) mView.findViewById(R.id.searchOriginButton);
    mSearchOriginButton.setOnClickListener(this);
    return mView;
}

@Override
public void onClick(View v) {
    mOriginPlace = (EditText) mView.findViewById(R.id.originPlaceText);
    String placeOriginText = mOriginPlace.getText().toString();
    List<Address> addressList = null;
    if (placeOriginText != null || !placeOriginText.equals("")) {
    Geocoder geocoder = new Geocoder(getActivity());
    try {
        addressList = geocoder.getFromLocationName(placeOriginText, 1);
    } catch (IOException e) {
        e.printStackTrace();
    }
    if(addressList.size() > 0) {
        Address address = addressList.get(0);
        LatLng latLng = new LatLng(address.getLatitude(), address.getLongitude());
        mMap.addMarker(new MarkerOptions()
                .position(latLng)
                .title("Marker"));
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));
    }
    } else {
        Toast.makeText(getActivity(), "Please enter origin address!", Toast.LENGTH_SHORT).show();
    }
}

public void setUpMapIfNeeded() {
    if (mMap == null) {
        SupportMapFragment mapFragment = (SupportMapFragment) getChildFragmentManager()
                .findFragmentById(R.id.originPlaceMap);
        mapFragment.getMapAsync(this); //it'll start map service, getMapAsync(), чтобы установить обратный вызов для фрагмента
    }
}

}

来自 logcat 的日志:

    04-20 18:44:11.154 6485-6485/com.itshareplus.googlemapdemo E/AndroidRuntime: FATAL EXCEPTION: main
                                                                         Process: com.itshareplus.googlemapdemo, PID: 6485
                                                                         java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
                                                                             at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                                                                             at java.util.ArrayList.get(ArrayList.java:308)
                                                                             at fragments.OneFragment.onClick(OneFragment.java:94)
                                                                             at android.view.View.performClick(View.java:4909)
                                                                             at android.view.View$PerformClick.run(View.java:20390)
                                                                             at android.os.Handler.handleCallback(Handler.java:815)
                                                                             at android.os.Handler.dispatchMessage(Handler.java:104)
                                                                             at android.os.Looper.loop(Looper.java:194)
                                                                             at android.app.ActivityThread.main(ActivityThread.java:5848)
                                                                             at java.lang.reflect.Method.invoke(Native Method)
                                                                             at java.lang.reflect.Method.invoke(Method.java:372)
                                                                             at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)
04-20 18:44:11.328 6485-6485/com.itshareplus.googlemapdemo I/Process: Sending signal. PID: 6485 SIG: 9

【问题讨论】:

  • 显示崩溃错误?
  • 应用崩溃时必须发布 logcat 输出。根据日志,可以做进一步调查
  • 我添加了 logcat 输出
  • 一个问题,,,你看到屏幕上的地图了吗?
  • 是的,正如我所说的那样显示

标签: android google-maps android-fragments


【解决方案1】:

由于您没有添加崩溃日志,因此很难为您的问题提供解决方案。您可以确保更新地图视图是否发生在主 UI 线程上(使用主循环器)。取决于您的屏幕导航方式,有时 getActivity 将为空,请确保也是如此。如果您添加崩溃日志,我可以为您提供更多帮助

【讨论】:

  • 我添加了 logcat 输出
  • 您能否在从地址列表中检索对象之前添加检查。 if(addessList.size >0){ 然后做你的工作}
  • 谢谢,现在它不会压碎了。所以这意味着geocder无法从EditText获取地址,你能帮忙吗?
  • 我相信您的编辑文本在片段内,如果这是真的,请使 View 视图全局变量并使用 view.findviewById() 初始化编辑文本;让我知道结果,希望它能起作用
  • 还是不行,我按照你说的更新片段代码(见上图)
【解决方案2】:

Address 需要一些时间来接收来自地理编码器的结果,因此请尝试将整个 onclick 方法放在 try catch 块下。

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2020-04-10
    • 2019-09-29
    • 2011-08-15
    • 2016-03-13
    • 1970-01-01
    相关资源
    最近更新 更多