所以,这是我的问题:
我在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/