onClick方法不起作用

时间:2016-09-09 08:36:46

标签: android xml google-maps android-layout arraylist

我想在android按钮中使用onClick方法,但它无法正常工作。另一方面,当我使用onClickListener时,它会向我显示另一个错误,如

  

java.lang.IndexOutOfBoundsException:索引0无效,大小为0

我无法找到它的问题。

Java代码如下:

public void onSearch(View view) throws IOException{

        EditText sLocation = (EditText) view.findViewById(R.id.editText1);
         String location = sLocation.getText().toString();
         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));
        }

    }

add_masjid.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="#000000">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/editText1"
        android:layout_alignBottom="@+id/editText1"
        android:layout_alignParentStart="true"
        android:text="@string/xyz"
        android:textColor="#FFFFFF"
        android:textSize="20sp"
        />

    <Button
        android:id="@+id/generalId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/rect1"
        android:onClick="onSearch"
        android:text="@string/abc"
        android:textColor="#FFFFFF"
        android:textSize="20sp"
        android:clickable="true" />

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/textView1"
        android:layout_toStartOf="@+id/generalId"
        android:ems="10"
        android:inputType="text"
        android:background="#FFFFFF"
        android:labelFor="@+id/editText1"
        android:layout_above="@+id/map"
        android:layout_alignParentTop="true" />

    <com.google.android.gms.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/generalId">

    </com.google.android.gms.maps.MapView>


</RelativeLayout>

2 个答案:

答案 0 :(得分:0)

检查您的addressList。它可能是空的。这就是你得到的原因

  

java.lang.IndexOutOfBoundsException:索引0无效,大小为0

答案 1 :(得分:0)

onClick方法与问题无关。来自getFromLocationName的文档:

  

[...]如果未找到匹配项,则返回null或空列表   没有后端服务。

因此,您可能也会获得NPE。执行null和空洞检查以避免此类错误。

样本解决方案:

public void onSearch(View view) throws IOException {

    EditText sLocation = (EditText) view.findViewById(R.id.editText1);
    String location = sLocation.getText().toString();
    List<android.location.Address> addressList = null;

    if (location != null || !location.equals("")) {
        Geocoder geocoder = new Geocoder(getActivity().getApplicationContext());
        try {
            addressList = geocoder.getFromLocationName(location, 1);
            if (addressList != null && !addressList.isEmpty()) {
                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));
            } else {
                Toast.makeText(getActivity(), "Failed to resolve address", Toast.LENGTH_SHORT).show();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意:此代码会阻塞,直到getFromLocationName方法返回。在主线程上这样做是个坏主意。