java - 在数组中搜索标记并找到它们

标签 java android arrays search google-maps-markers

所以,这是我的问题:

我在onMapReady方法中定义了一个String数组:

String [] thePlaces = {"Thirsty Monk", "Cocolino", "The Melting Pot", "De Danu", "Carciuma", "Boca", "Bar Acasa"};


数组中的所有字符串均由单独的标记定义,如下所示:

 //Carciuma
    LatLng test1 = new LatLng(43.604892, 1.476562);
    mMap.addMarker(beerMarker.position(test1).title("Carciuma"));


我声明了以下方法:

private void gotoLocation(double lat, double lng, float zoom){

    LatLng latLng = new LatLng(lat, lng);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, zoom);
    mMap.moveCamera(update);
}

private void hideSoftKeyboard(View v){
    InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}


public void locateFromString(View view) {

    hideSoftKeyboard(view);

    TextView tv = (TextView) findViewById(R.id.editText1);
    String searchString = tv.getText().toString();


在我的地图上,我创建了一个搜索字段,我只想在数组的字符串内执行搜索。因此,当我按下搜索按钮来查找用户引入的标记名称时,将调用locateFromString方法。我认为该方法应查看用户引入的标记在数组中是否存在。如果存在,则应使用gotoLocation方法找到它,如果不显示Toast,则表明搜索到的标记不在数组中。

我到底该怎么做?在数组中搜索,是否找到名称以查找它?

预先感谢您的回答!

更新

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

GoogleMap mMap;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);



    assert getSupportActionBar() != null;
    ActionBar actionBar = getSupportActionBar();
    actionBar.setLogo(R.mipmap.ic_launcher);
    actionBar.setDisplayUseLogoEnabled(true);
    actionBar.setDisplayShowHomeEnabled(true);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()){

        case R.id.location:
            Toast.makeText(getApplicationContext(), "Location selected", Toast.LENGTH_LONG).show();
            return true;
        case R.id.map_type:
            Toast.makeText(getApplicationContext(), "Map Type selected", Toast.LENGTH_LONG).show();
            return true;
        case R.id.share_app:
            Toast.makeText(getApplicationContext(), "Share the APP", Toast.LENGTH_LONG).show();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

}

@Override
public void onMapReady(GoogleMap googleMap) {

    mMap = googleMap;


    LatLng cityView = new LatLng(43.604346, 1.443760);
    mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(cityView, 12));


    MarkerOptions beerMarker = new MarkerOptions()
                            .icon(BitmapDescriptorFactory.fromResource(R.drawable.beer_marker));


    // The Thirsty monk
    LatLng thirstyMonk = new LatLng(43.607044, 1.450307);
    mMap.addMarker(beerMarker.position(thirstyMonk).title("Thirsty Monk"));
    // The Cocolino
    LatLng cocolino = new LatLng(43.571505, 1.417759);
    mMap.addMarker(beerMarker.position(cocolino).title("Cocolino"));
    //The Melting Pot
    LatLng meltingPot = new LatLng(43.607469, 1.447162);
    mMap.addMarker(beerMarker.position(meltingPot).title("The Melting Pot"));
    //De Danu
    LatLng deDanu = new LatLng(43.600723, 1.455917);
    mMap.addMarker(beerMarker.position(deDanu).title("De Danu"));
    //Carciuma
    LatLng test1 = new LatLng(43.604892, 1.476562);
    mMap.addMarker(beerMarker.position(test1).title("Carciuma"));
    //Test2
    LatLng test2 = new LatLng(43.604496, 1.474924);
    mMap.addMarker(beerMarker.position(test2).title("Boca"));
    //Test3
    LatLng test3 = new LatLng(43.604781, 1.474502);
    mMap.addMarker(beerMarker.position(test3).title("Bar Acasa"));

}

private void gotoLocation(double lat, double lng, float zoom){

    LatLng latLng = new LatLng(lat, lng);
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(latLng, zoom);
    mMap.moveCamera(update);
}

private void hideSoftKeyboard(View v){
    InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}


public void locateFromString(View view) {

    hideSoftKeyboard(view);

    TextView tv = (TextView) findViewById(R.id.editText1);
    String searchString = tv.getText().toString();



    ArrayList<String> thePlaces = new ArrayList<>();
    thePlaces.add("Thirsty Monk");
    thePlaces.add("Cocolino");
    thePlaces.add("The Melting Pot");
    thePlaces.add("De Danu");
    thePlaces.add("Carciuma");
    thePlaces.add("Boca");
    thePlaces.add("Bar Acasa");


    ArrayList<String> places = new ArrayList<String>(Arrays.asList(thePlaces));
    if (places.contains(searchString)) {



        //do something
    };

   // if (thePlaces.contains(searchString)){



    //if (searchString.length() > 0){

      //  Toast.makeText(this, "Searching for: " + searchString, Toast.LENGTH_SHORT).show();

    //} else {
   //     Toast.makeText(this, "There is no " + searchString + " subscribed to this app!", Toast.LENGTH_LONG).show();
   // }


    //Geocoder gc = new Geocoder(this);


}


}

最后几行是我尝试过的一些事情,请不要过分!

更新XML
在这里,我用自动完成功能更改了EditText:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.gadgetcatch.happyhourtoulouse.MainActivity">

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:id="@+id/search_pub"
        android:paddingLeft="10dp"
        android:paddingRight="10dp">


        <AutoCompleteTextView
            android:id="@+id/editText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/button1"
            android:layout_toStartOf="@+id/button1"
            android:ems="10"
            android:hint="@string/search_pub"
            android:inputType="textCapWords">

            <requestFocus />
        </AutoCompleteTextView>

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentEnd="true"
            android:layout_alignParentRight="true"
            android:text="@string/search_go"
            android:onClick="locateFromString"/>
    </RelativeLayout>

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/map"
        class="com.google.android.gms.maps.SupportMapFragment"/>


</LinearLayout>


这是日志:

04-02 19:42:08.791 11984-11984 / com.gadgetcatch.happyhourtoulouse E / AndroidRuntime:FATAL EXCEPTION:main
流程:com.gadgetcatch.happyhourtoulouse,PID:11984
java.lang.IllegalStateException:无法执行android:onClick的方法
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
在android.view.View.performClick(View.java:5254)
在android.view.View $ PerformClick.run(View.java:21179)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:6837)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
造成原因:java.lang.reflect.InvocationTargetException
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
在android.view.View.performClick(View.java:5254)
在android.view.View $ PerformClick.run(View.java:21179)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:6837)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'boolean java.util.ArrayList.contains(java.lang.Object)'
在com.gadgetcatch.happyhourtoulouse.MainActivity.locateFromString(MainActivity.java:182)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
在android.view.View.performClick(View.java:5254)
在android.view.View $ PerformClick.run(View.java:21179)
在android.os.Handler.handleCallback(Handler.java:739)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:145)
在android.app.ActivityThread.main(ActivityThread.java:6837)
在java.lang.reflect.Method.invoke(本机方法)
在java.lang.reflect.Method.invoke(Method.java:372)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1404)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

最佳答案

如果将数组转换为ArrayList没问题-可以使用contains()方法检查searchString是否在列表中。如果您希望搜索不区分大小写-将数组和searchString中的值转换为大写/小写。请参见以下示例:

    ...
    ArrayList<String> places = new ArrayList<>(Arrays.asList(thePlaces));
    if (places.contains(searchString)) {
        //do something
    };


更新

关于locateFromString方法-由于您已经具有ArrayList thePlaces,因此不需要places。我也建议将thePlaces设置为实例变量,例如mMap,并将其填充到onCreate或初始化程序块中。这样,阵列列表将仅创建一次,而不是每次调用locateFromString时都会创建。

public void locateFromString(View view) {
    hideSoftKeyboard(view);
    TextView tv = (TextView) findViewById(R.id.editText1);
    String searchString = tv.getText().toString();

    ArrayList<String> thePlaces = new ArrayList<>();
    thePlaces.add("Thirsty Monk");
    thePlaces.add("Cocolino");
    thePlaces.add("The Melting Pot");
    thePlaces.add("De Danu");
    thePlaces.add("Carciuma");
    thePlaces.add("Boca");
    thePlaces.add("Bar Acasa");


    if (thePlaces.contains(searchString)) {
        //call goToLocation
    } else {
        Toast.makeText(this, "There is no " + searchString + " subscribed to this app!", Toast.LENGTH_LONG).show();
    }
}

关于java - 在数组中搜索标记并找到它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36338916/

相关文章:

java - 如何在 Java 中格式化 Twitter 时间戳?

android - 找不到Android Studio 4.0.1默认 Activity

android - 如何从可以输入 Spring Security 安全 Web 服务方法的 Android 应用发出请求?

c++ - C++ 数组中的数组

java - 即使 Libgdx 说它已加载到内存中,声音第一次也不会播放

java - 在 Java Array<> libgdx 方面需要帮助

jquery - 多个子数组中特定索引处的值的总和/平均值 - jQuery

c - 如何在 C 中声明和使用全局二维数组?

java - Maven Hibernate 实体类未找到异常

java - 正则表达式:删除第二个 "-"之前和之后的所有内容