Android 错误java.lang.IndexOutOfBoundsException:索引0无效,viewPager的片段大小为0

Android 错误java.lang.IndexOutOfBoundsException:索引0无效,viewPager的片段大小为0,android,google-maps,arraylist,indexoutofboundsexception,Android,Google Maps,Arraylist,Indexoutofboundsexception,我正在使用选项卡(viewPager)中的地图,我想在地图中搜索位置。为此,我正在使用EditText字段和数组列表,但仍然出现此错误。我找不到它有什么问题。请任何人建议我,我该怎么办 FATAL EXCEPTION: main Process: com.example.saroosh.masjidnow, PID: 10465 java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0 at java.u

我正在使用选项卡(viewPager)中的地图,我想在地图中搜索位置。为此,我正在使用EditText字段和数组列表,但仍然出现此错误。我找不到它有什么问题。请任何人建议我,我该怎么办

FATAL EXCEPTION: main    Process: com.example.saroosh.masjidnow, PID: 10465
    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
com.example.saroosh.masjidnow.Tabs.AddMasjid$1.onClick(AddMasjid.java:61) at
    android.view.View.performClick(View.java:5184)    at
    android.view.View$PerformClick.run(View.java:20910)    at
    android.os.Handler.handleCallback(Handler.java:739)    at
    android.os.Handler.dispatchMessage(Handler.java:95)    at
    android.os.Looper.loop(Looper.java:145)    at
    android.app.ActivityThread.main(ActivityThread.java:5942)    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:1389)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1184)
下面给出了我的java类

AddMasjid.java

package com.example.saroosh.masjidnow.Tabs;

import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Geocoder;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.content.Context;
import android.widget.Button;
import android.widget.EditText;

import com.example.saroosh.masjidnow.R;
import com.google.android.gms.identity.intents.Address;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.util.List;

public class AddMasjid extends Fragment implements OnMapReadyCallback {

    MapView gMapView;
    GoogleMap gMap = null;
    Button sButton;
    String location;

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.add_masjid, container, false);
        EditText sLocation = (EditText) v.findViewById(R.id.editText1);
        location = sLocation.getText().toString();
        sButton = (Button) v.findViewById(R.id.generalId);
        sButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                List<android.location.Address> addressList= null;

                if (location != null || !location.equals(""))
                {
                    Geocoder geocoder = new Geocoder(getActivity().getApplicationContext());
                    try {
                        addressList = geocoder.getFromLocationName(location, 1);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    android.location.Address address = addressList.get(0);
                    LatLng latlng = new LatLng(address.getLatitude(),address.getLatitude());
                    gMap.addMarker(new MarkerOptions().position(latlng).title("Marker"));
                    gMap.animateCamera(CameraUpdateFactory.newLatLng(latlng));
                }

            }
        });

        gMapView = (MapView) v.findViewById(R.id.map);
        gMapView.getMapAsync(this);
        gMapView.onCreate(savedInstanceState);
        gMapView.onResume(); // needed to get the map to display immediately
        try {
            MapsInitializer.initialize(getActivity().getApplicationContext());
        } catch (Exception e) {
            e.printStackTrace();
        }

        return v;
    }


    @Override
    public void onMapReady(GoogleMap map) {
        gMap = map;
        gMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
        gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new
                LatLng(0, 0), 0));


        if (gMap != null) {
            gMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
            if (ActivityCompat.checkSelfPermission(getActivity().getApplicationContext()
                    , Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity().getApplicationContext()
                    , Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            gMap.setMyLocationEnabled(true);
            gMap.getUiSettings().setMyLocationButtonEnabled(true);


        }
    }
    @Override
    public void onResume() {
        super.onResume();
        gMapView.onResume();

    }

    public void onSearch(View view) throws IOException{

    }

    @Override
    public void onPause() {
        super.onPause();
        gMapView.onPause();

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        gMapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        gMapView.onLowMemory();
    }


}
package com.example.saroosh.masjidnow.Tabs;
导入android.Manifest;
导入android.content.pm.PackageManager;
导入android.location.Geocoder;
导入android.support.annotation.Nullable;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.app.Fragment;
导入android.os.Bundle;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.content.Context;
导入android.widget.Button;
导入android.widget.EditText;
导入com.example.saroosh.masjidnow.R;
导入com.google.android.gms.identity.intents.Address;
导入com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
导入com.google.android.gms.maps.MapFragment;
导入com.google.android.gms.maps.MapView;
导入com.google.android.gms.maps.mapsintializer;
导入com.google.android.gms.maps.OnMapReadyCallback;
导入com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.MarkerOptions;
导入java.io.IOException;
导入java.util.List;
公共类AddMasjid扩展了mapreadycallback上的片段实现{
地图视图;
谷歌地图gMap=null;
按钮按钮;
字符串位置;
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图v=充气机。充气(R.layout.add_masjid,容器,假);
EditText位置=(EditText)v.findViewById(R.id.editText1);
location=sLocation.getText().toString();
sButton=(Button)v.findViewById(R.id.generalId);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
List addressList=null;
if(location!=null | |!location.equals(“”)
{
Geocoder Geocoder=新的地理编码器(getActivity().getApplicationContext());
试一试{
addressList=geocoder.getFromLocationName(位置,1);
}捕获(IOE异常){
e、 printStackTrace();
}
android.location.Address=addressList.get(0);
LatLng LatLng=新LatLng(address.getLatitude(),address.getLatitude());
gMap.addMarker(新的MarkerOptions().position(latlng).title(“Marker”);
gMap.animateCamera(CameraUpdateFactory.newLatLng(latlng));
}
}
});
gMapView=(MapView)v.findViewById(R.id.map);
getMapAsync(this);
gMapView.onCreate(savedInstanceState);
gMapView.onResume();//需要立即显示地图
试一试{
初始化(getActivity().getApplicationContext());
}捕获(例外e){
e、 printStackTrace();
}
返回v;
}
@凌驾
已于4月1日公开作废(谷歌地图){
gMap=地图;
gMap.setMapType(GoogleMap.MAP\u TYPE\u NORMAL);
gMap.moveCamera(相机更新工厂)newLatLngZoom(新
LatLng(0,0,0));
如果(gMap!=null){
gMap.addMarker(新的MarkerOptions().position(新的LatLng(0,0)).title(“Marker”);
if(ActivityCompat.checkSelfPermission(getActivity().getApplicationContext())
,Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予和&ActivityCompat.checkSelfPermission(getActivity().getApplicationContext())
,Manifest.permission.ACCESS\u\u位置)!=PackageManager.permission\u已授予){
考虑到呼叫
//ActivityCompat#请求权限
//在此处请求缺少的权限,然后覆盖
//public void onRequestPermissionsResult(int-requestCode,字符串[]权限,
//int[]格兰特结果)
//处理用户授予权限的情况。请参阅文档
//对于ActivityCompat,请请求权限以获取更多详细信息。
返回;
}
gMap.setMyLocationEnabled(真);
gMap.getUiSettings().setMyLocationButtonEnabled(true);
}
}
@凌驾
恢复时公开作废(){
super.onResume();
gMapView.onResume();
}
公共void onSearch(视图)引发IOException{
}
@凌驾
公共无效暂停(){
super.onPause();
gMapView.onPause();
}
@凌驾
公共空间{
super.ondestory();
gMapView.onDestroy();
}
@凌驾
public void onLowMemory(){
super.onLowMemory();
gMapView.onLowMemory();
}
}

此处的地址列表为空:
addressList.get(0)

请注意,并非每个位置都有有效地址。您的代码必须处理这个事实

List<android.location.Address> addressList= null;
尝试日志以检查添加位置

if (location != null || !location.equals(""))
            {
                Geocoder geocoder = new Geocoder(getActivity().getApplicationContext());
                try {
                    addressList = geocoder.getFromLocationName(location, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

因为这可能不会给你任何记录,并且带有addressList。get(0)你在java位置中取你所知道的位置0,从0,1,2开始,如果没有位置0,你将得到错误边界异常

我已经解决了我的问题。我通过
onCreat
方法中的
editText
字段传递我的位置字符串,也就是说,我的
addressList
在列表中找不到位置,因此出错。当我在
setOnClickListener
方法中声明我的
editText
时,我的列表
if (location != null || !location.equals(""))
            {
                Geocoder geocoder = new Geocoder(getActivity().getApplicationContext());
                try {
                    addressList = geocoder.getFromLocationName(location, 1);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
sButton =(Button) v.findViewById(R.id.generalId);
        sButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                hideSoftKeyboard(v);
                EditText sLocation = (EditText)getActivity().findViewById(R.id.editText1);
                location = sLocation.getText().toString();

                List<android.location.Address> addressList= null;

                if (location != null || location.length()>0) {
                    Geocoder geocoder = new Geocoder(getActivity().getApplicationContext());
                    try {
                        addressList = geocoder.getFromLocationName(location, 1);

                    } catch (IOException e) {

                            e.printStackTrace();
                    }

                    android.location.Address address = addressList.get(0);
                    String locality = address.getLocality();
                    Toast.makeText(getActivity(), locality, Toast.LENGTH_LONG).show();
                    double latitude = address.getLatitude();
                    double longitude = address.getLongitude();
                    LatLng latLng = new LatLng(latitude, longitude);
                    gMap.addMarker(new MarkerOptions().position(latLng).title("Marker"));
                    gMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));

                }

            }
        });