Подтвердить что ты не робот

Как реализовать виджет поиска в 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 и получает меня в местах или есть более умный способ?

4b9b3361

Ответ 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);

Если у вас есть какие-либо проблемы, дайте мне знать, у меня была аналогичная проблема сегодня и прочитал ваш вопрос без ответа.