google search implementation

X

xdroid-man

Neues Mitglied
0
Hallo,

leider versuche ich derzeit vergebens die Google search api in meine App zu integrieren.

Was ich gerne möchte ist:

- verwenden von SearchView (nicht search dialog)
- ich möchte gerne die SearchView direckt im layout angezeigt bekommen. Nicht im "OptionsMenue"

MainActivity --> onCreate()
Code:
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) findViewById(R.id.MainActivity_SearchView);
        // Assumes current activity is the searchable activity
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default
Manifest.xml --> Eintrag für die searchacrivity
Code:
  <activity 
            android:name=".SearchActivity"
            android:label="@string/title_activity_search"
            android:launchMode="singleTop">
            
            <intent-filter>
                <action 
                    android:name="android.intent.action.SEARCH"/>
            </intent-filter>
            <meta-data 
                android:name="android.app.searchable"
                android:resource="@xml/searchable"/>
        </activity>
Zusätzlich habe ich natürlich noch die SearchView im Layout der mainactivity eingetragen und die searchable.xml im res/xml Verzeichnis angelegt.

Nun hätte ich erwartet das bei jedem neuen/zusätzlichen buchstaben den ich in der SearchView eingebe die "SearchActivity" aufgerufen wird.

Falls ich Angaben vergessen habe die für die Problemlösung wichtig sind reiche ich diese gerne nach.

Vielen Dank schon mal für die Hilfe.

Grüße
 
Hallo,
so ganz schlau werde ich aus deinem Code nicht, da er etwas unvollständig erscheint, aber hier ein Snippet, das bei mir eine Suche durchführt...

Code:
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);

        SearchView searchView = (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

            @Override
            public boolean onQueryTextSubmit(String s) {
                if (mCardListFragment != null) {

                    if (searchIt(s)) return false;

                }
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                if (mCardListFragment != null) {

                    if (searchIt(s)) return false;

                }
                return false;
            }
        });

        return true;
    }

Nachtrag: an den Rückgabewerten brauchst du dich nicht weiter stören..
 
Hallo Missspelled,

Vielen Dank für deine Antwort.

Ich hätte da noch ne Frage.

Wird bei dir eine spezielle Activity verwendet die von der SearchView aufgerufen wird?

Die Methode searchIt() wäre noch mal interessant.

Grüße
 
Hallo,
hmm... wirklich interessant ist die searchIt() nicht :p ich ersetze einfach nur ein Fragment und übergebe die "Suche" besser gesagt, das was der Nutzer eingegeben hat..
Siehe selbst:
Code:
    private boolean searchIt(String s) {
        if (s.length() < 1) return true;

        mCardListFragment = new CardListFragment();
        Bundle args = new Bundle();
        args.putString(MC.BNL_PW, mP);
        args.putString(MC.BNL_FAVORITE_OBJECT_ID, MC.SEARCH_MASK);
        args.putString(MC.BNL_SEARCH_ID, s);

        mCardListFragment.setArguments(args);

        android.support.v4.app.FragmentManager
                fragmentManager = getSupportFragmentManager();

        android.support.v4.app.FragmentTransaction
                fragmentTransaction = fragmentManager.beginTransaction();

        fragmentTransaction.replace(R.id.main_frame_container, mCardListFragment);
        fragmentTransaction.commit();
        return false;
    }
das Fragment übernimmt die Suche dann eigenständig..

OnCreateView erhält die Daten
Code:
...
 MainActivity mainActivity = (MainActivity) getActivity();

        if (MC.DBG) Log.e(TAG, "lableId=" + lableId);

...

 if (lableId.equals(MC.SEARCH_MASK)) {
                fillListByMatchingSearch(bundle, mainActivity);
            }
...
Listenfüllung erfolgt dann so..
Code:
    private void fillListByMatchingSearch(Bundle bundle, MainActivity mainActivity) {
        List<Card> tmpAllCards = mainActivity.getDatabase().getAllCards();
        String userInput = bundle.getString(MC.BNL_SEARCH_ID);

        for (Card card : tmpAllCards) {
            if (card.getTitle().toLowerCase().contains(userInput.toLowerCase())) {
                mCards.add(card);
            }
        }
    }
Aber ob dir das großartig weiterhilft? Bei mir läuft die Suche halt intern auf Daten, die sich in einer Datenbank befinden, ab..
 
Hallo,

ja das bringt schon ein wenig Licht ins dunkle aber was mich in der Tat wundert ist das die "Suchanfrage" von dir zum Fragment geschickt werden müssen. (zumindest habe ich dich so verstanden)

Ich war der Meinung in der Android developer Hilfe verstanden zu haben der die Suchanfrage eigenständig via Intent zur "SearchActivity" gesendet wird.

Ich frage mich was mir die API denn dann überhaupt abnimmt an Arbeit.

- Die Suche muss ich selber implementieren
- Die Suchanfrage selber zur "SearchAcrivity" bzw "SearchFragment"
- Und das darstellen der Ergebnisse muss ich auch selber umsetzen.

Dann kann ich doch auch gleich alles selber machen. Ich versteh leider denn Sinn der API dann nicht mehr. :confused2:

Noch mal vielen Dank

Grüße
 
Hehe :D :D denn Sinn der API verstehe ich auch nicht - bzw. hab mir auch nicht viele Gedanken über die API gemacht, da ich mir gedacht habe, dass ich die Suche recht einfach selbst implementieren konnte, jedenfalls genügt "meine" Suche den Anforderungen, die ich stelle...

Kurze Erklärung:
ich suche nach
-dem "Enthaltensein" eines Wortfetzens und das (String.contains())
-unabhängig von Groß und kleinschreibung (toLowerCase())

somit ist es eine "scharfe Suche" mit Toleranz der Groß- und Kleinschreibung.. Wenn dir das ausreicht, kannst du den Code ja so übernehmen ;)
 
Ja Vielen Dank.

Die Unterhaltung mit dir hat mir sehr geholfen.

Vielen Dank noch mal!!!!!!!

Viele Grüße
 

Ähnliche Themen

F
Antworten
0
Aufrufe
822
FlorianAlfredo
F
R
Antworten
3
Aufrufe
1.571
Ritartet
R
W
  • welder99
Antworten
0
Aufrufe
777
welder99
W
Zurück
Oben Unten