Как реализовать виджет поиска в Action Bar Sherlock?
Я попытался открыть окно поиска в Action Bar Sherlock.
Это мой PreLocationActivity
:
@ContentView(R.layout.search)
public class PreLocationActivity extends RoboSherlockActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.map_layout);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Used to put dark icons on light action bar
menu.add("Search")
.setIcon(R.drawable.ic_search_inverse)
.setActionView(R.layout.collapsible_edittext)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
return true;
}
@Override
public boolean onSearchRequested() {
return super.onSearchRequested();
}
}
Это мой SearchableActivity
:
@ContentView(R.layout.search)
public class SearchableActivity extends RoboSherlockFragmentActivity {
@InjectView(R.id.addressListView) ListView addressView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the intent, verify the action and get the query
Intent intent = getIntent();
if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
doGeoSearch(query);
}
}
public void doGeoSearch(String query){
Geocoder geocoder;
ArrayList<Address> addresses;
ArrayList<String> address = new ArrayList<String>() ;
geocoder = new Geocoder(this, Locale.getDefault());
try {
addresses = (ArrayList<Address>) geocoder.getFromLocationName(query, 6);
Log.d("Address",String.valueOf(addresses));
for(int i = 0;i<addresses.size();i++)
{
String addr = new String();
addr.concat(addresses.get(i).getAddressLine(0));
addr.concat(addresses.get(i).getAddressLine(1));
addr = addresses.get(i).getAddressLine(0) + addresses.get(i).getLocality() + addresses.get(i).getAdminArea();
//addr.concat(addresses.get(i).getAddressLine(2));
Log.d("addr",addr);
address.add(addr);
}
SearchAddressAdapater addressList = new SearchAddressAdapater(getApplicationContext(),R.layout.search_list,addresses, SearchableActivity.this);
addressView.setAdapter(addressList);
//ListView addressListView = new ListView();
} catch (IOException e) {
//Handle exception
}
}
Нет успеха. Как и в случае, когда я печатаю что-то в операции Prelocation и нажимаю enter, ничего не выполняется. Должен ли я относиться к нему как к EditText
и писать текстовый прослушиватель для того, что затем вызывает geoCoder
и получает меня в местах или есть более умный способ?
Ответы
Ответ 1
private EditText search;
public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu)
{
menu.add(0, 1, 1, R.string.menu_search).setIcon(R.drawable.ic_action_search).setActionView(R.layout.action_search).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item)
{
switch (item.getItemId())
{
case 1:
search = (EditText) item.getActionView();
search.addTextChangedListener(filterTextWatcher);
search.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
}
private TextWatcher filterTextWatcher = new TextWatcher()
{
public void afterTextChanged(Editable s)
{
}
public void beforeTextChanged(CharSequence s, int start, int count, int after)
{
}
public void onTextChanged(CharSequence s, int start, int before, int count)
{
// your search logic here
}
};
Ответ 2
Библиотека поддержки Android (v4 + v7):
Библиотека поддержки v7: http://developer.android.com/tools/support-library/features.html#v7-appcompat
Теперь Google поддерживает совместимость ActionBar с Android 2.1 (API 7).
Легко сделать переход, потому что имена методов одинаковы и/или очень похожи.
Добавить библиотеку поддержки с ресурсами: http://developer.android.com/tools/support-library/setup.html#libs-with-res
Ваш манифест: AndroidManifest.xml
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="17" />
Ваше меню: menu.xml
<item
android:id="@+id/menu_search"
android:actionViewClass="android.support.v7.widget.SearchView"
android:icon="@drawable/ic_action_search"
android:showAsAction="ifRoom|collapseActionView"
android:title="Search"/>
ActionBarSherlock [устарело, используйте appcompat]:
Вот как использовать стандартный SearchView и SearchManager в Android с помощью ActionBarSherlock! Я использую этот код и отлично работаю. Я тестировал это на Android 2.3 (API 10) - Android 4.3 (API 18).
Великий учебник и документация:
http://developer.samsung.com/android/technical-docs/UI-unification-with-older-Android-versions-using-ActionBarSherlock
Имейте в виду:
Пользовательский поиск с ActionBarSherlock (минимум API 7)
SearchView с ActionBarSherlock (минимум API 8)
Ваше меню: menu.xml
<item
android:id="@+id/menu_search"
android:actionViewClass="com.actionbarsherlock.widget.SearchView"
android:icon="@drawable/ic_action_search"
android:showAsAction="ifRoom|collapseActionView"
android:title="Search"/>
Для обоих:
Ваша деятельность: MainActivity.java
public boolean onCreateOptionsMenu(Menu menu)
{
getSupportMenuInflater().inflate(R.menu.menu, menu);
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
if (null != searchView )
{
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
}
SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener()
{
public boolean onQueryTextChange(String newText)
{
// this is your adapter that will be filtered
adapter.getFilter().filter(newText);
return true;
}
public boolean onQueryTextSubmit(String query)
{
// this is your adapter that will be filtered
adapter.getFilter().filter(query);
return true;
}
};
searchView.setOnQueryTextListener(queryTextListener);
return super.onCreateOptionsMenu(menu);
}
Сообщите мне, если это сработает и для вас, и сообщите мне, если вам нужна дополнительная помощь!
Ответ 3
Аналогичный вопрос есть здесь, где у меня возникла проблема с назначением адаптера.
Как реализовать виджет поиска со списком с помощью SherlockActionbar?
Я надеюсь, что это поможет, потому что у меня была та же проблема.
Чтобы использовать адаптер, лучший способ заключается в том, что класс реализует SearchView.OnQueryTextListener, а затем вам не нужно создавать внутренний класс, и у вас будет адаптер.
В вашем коде будет что-то вроде:
public class MainActivity extends SherlockListActivity implements SearchView.OnQueryTextListener
а затем в классе вам необходимо определить методы. Адаптером будет адаптер, который у вас есть в адаптере класса ArrayAdapter. Но вы должны определить его как private в классе.
public boolean onQueryTextChange(String newText) {
// this is your adapter that will be filtered
adapter.getFilter().filter(newText);
return true;
}
public boolean onQueryTextSubmit(String query) {
// this is your adapter that will be filtered
adapter.getFilter().filter(query);
return true;
}
В строке, где вы устанавливаете:
searchView.setOnQueryTextListener(queryTextListener);
Должно быть:
searchView.setOnQueryTextListener(this);
Если у вас есть какие-либо проблемы, дайте мне знать, у меня была аналогичная проблема сегодня и прочитал ваш вопрос без ответа.