29 votes

Comment mettre en œuvre le widget de recherche dans la Barre d'Action de Sherlock?

J'ai essayé de me zone de Recherche de travail sur l'Action de la Barre de Sherlock.

C'est mon 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();
        }
    }

C'est mon 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
        }
    }

Pas de succès du tout. Comme, quand je tape quelque chose sur le Prelocation Activité et appuyez sur entrée, rien n'est en cours de recherche. Dois-je le traiter comme un EditText et écrire un texte auditeur qui appelle ensuite l' geoCoder et me met le lieux ou est-il une façon plus intelligente d'aller à ce sujet?

38voto

Jared Burrows Points 3932

Mis à jour (12/9/13)

Android Support Library(v4 + v7):

Bibliothèque de prise en charge v7: http://developer.android.com/tools/support-library/features.html#v7-appcompat

Google prend désormais en charge le contrôle ActionBar compatibilité en arrière pour Android 2.1(API 7).

Il est facile de faire la transition parce que la méthode de même nom et/ou très similaires.

Ajouter le Support de la Bibliothèque de Ressources: http://developer.android.com/tools/support-library/setup.html#libs-with-res

Votre Manifeste: AndroidManifest.xml

<uses-sdk
  android:minSdkVersion="7"
  android:targetSdkVersion="17" />

Votre Menu: 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:

Voici comment utiliser la norme SearchView et SearchManager dans Android avec ActionBarSherlock! Je suis l'aide de ce code et fonctionne très bien. J'ai testé sur Android 2.3(API 10) - Android 4.3(API 18).

Bon Tutoriel et de la Documentation:

http://developer.samsung.com/android/technical-docs/UI-unification-with-older-Android-versions-using-ActionBarSherlock

Gardez à l'esprit:

Recherche personnalisée avec ActionBarSherlock(min. API 7)

SearchView avec ActionBarSherlock(min. API 8)

Votre Menu: 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"/>

Pour Les Deux:

Votre Activité: 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);
    }

Laissez-moi savoir si cela fonctionne pour vous et laissez-moi savoir si vous avez besoin de plus d'aide!

26voto

Georgy Gobozov Points 4814
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
    }
};

2voto

Javier Salinas Points 151

Une question similaire il y a ici, où j'ai eu le problème pour attribuer la carte.

Comment mettre en œuvre le widget de recherche avec une liste à l'aide de SherlockActionbar?

J'espère qu'il aidera parce que j'ai eu le même problème.

Pour utiliser l'adaptateur de la meilleure façon, c'est que la classe implémente SearchView.OnQueryTextListener et puis vous n'avez pas à créer l'intérieur de la classe et vous aurez la carte.

Dans votre code sera quelque chose comme:

public class MainActivity extends SherlockListActivity implements SearchView.OnQueryTextListener

et puis dans la classe que vous avez à définir les modalités. La carte est la carte que vous avez dans votre classe ArrayAdapter adaptateur. Mais vous devez le définir comme privé dans la classe.

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;
}

Dans la ligne où vous définissez:

 searchView.setOnQueryTextListener(queryTextListener);

Devrait être:

 searchView.setOnQueryTextListener(this);

Si vous avez un problème, faites le moi savoir, j'étais avec un problème similaire d'aujourd'hui et de lire votre question sans réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X