2012-08-24 49 views
0

我需要一個組件,允許用戶輸入一個值並通過連接到Internet上的某個站點來檢查它是否存在,並在用戶輸入時顯示建議。我想使用的搜索查看組件,但發現它有一定的侷限性:Android SearchView組件的自定義

  1. 的開發人員能夠創建處理搜索一個單獨的活動。我不想使用其他活動,我只想連接到該網站並檢查用戶是否存在類型。

  2. 爲了使用建議機制,開發人員必須構建一個內容提供者。再次,我不想連接到任何數據庫,我只需要使用標準HTTP消息向網站發送搜索查詢,並且我不需要內容提供者。

所以我的問題是:有沒有使用與定製我的需要,還是我找難看的解決方法,通過該組件的要求遵守搜索查看組件的方式,還要做什麼,我需要?

謝謝。

回答

0

你不應該運行在你的UI線程的HTTP請求,因爲你不能保證他們會及時完成所以他們可能會鎖定。你需要在可運行的或ASyncTask中運行它。

如果你想做一個快速的骯髒的黑客方式,你可以創建一個ListFragment來顯示你的自定義建議。然後創建一個OnQueryTextListener(或讓您的Activity實現它)將其設置在SearchView上。然後在聽衆的方法onQueryTextChange(String text)生成建議(如果從web服務得到這種方法啓動你的ASyncTask),然後用數據更新ListFragment適配器

+0

好吧,但如果我使用ListFragment,那麼我將不必使用SearchView。我可以使用EditText和OnKeyListener來獲得相同的效果。問題是,如果有一種方法可以掛鉤到SearchView並使用其建議機制和UI,但是可以通過自定義的方式從我想要的任何源獲取建議,而不一定是內容提供者。 – user940016

+0

只需製作您自己的ContentProvider即可返回您想要的數據(不一定是數據庫)。 這或子類SearchView並重新編寫適當的方法接受來自你想要的數據並適當地顯示它(你可能需要看看源代碼,看看它是如何完成的) – bennettaur

+0

好吧,但那麼怎麼樣可搜索的活動?我不想使用它,但我必須定義它。我可以建立一個虛擬活動,但並不真正顯示嗎? – user940016

0

這很簡單。您只需要使用Google的搜索功能,以便當用戶長按菜單按鈕時,它會加載一個搜索文本框,您可以在其中輸入搜索查詢以在您的應用程序中進行搜索。

可搜索的應用程序文件必須包含該元素作爲根節點並指定一個或多個屬性。 e.g

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label"
android:hint="@string/search_hint" >
</searchable>

然後宣佈任何活動接受ACTION_SEARCH即

<application ... >
<activity android:name=".SearchableActivity" >
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable"/>
</activity>
</application>

現在,我們需要控制查詢以及它是如何執行。 我用這個爲我的應用程序。

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.search);

// 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);
doMySearch(query);
}
}

+0

我認爲你不明白我的問題...我知道如何以標準方式使用搜索小部件,但我不希望有可搜索的活動... – user940016