在 Android 中实现文本更改的搜索功能
Implementing Search Functionality on Text Change in Android
我正在尝试使用 link http://developer.android.com/guide/topics/search/search-dialog.html.
在我的 Android 应用程序中实现搜索功能
它只能搜索按下搜索按钮时输入的文本。但是当搜索栏中的文本发生变化时,它无法执行搜索。我想实现那种功能,就像在 Android 手机的 "People" 或 "Contact" 应用程序中一样。
我曾多次尝试搜索此内容,但找不到任何 link。如果有人可以将我指向那些 link,那将很有用。提前致谢。
编辑:
我只在 MainActivity 中实现了搜索功能。 MainActivity.java 的代码:
findViewById(R.id.id1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSearchRequested();
}
});
Android 清单:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/activity_search" />
</activity>
首先你需要在你的 activity 中有处理程序:
private static class SearchHandler extends Handler {
private WeakReference<CitySelectionActivity> mTarget;
SearchHandler(CitySelectionActivity target) {
mTarget = new WeakReference<>(target);
}
public void setTarget(CitySelectionActivity target) {
mTarget.clear();
mTarget = new WeakReference<>(target);
}
@Override
public void handleMessage(final Message msg) {
if (msg.what == CitySelectionActivity.TRIGGER_SEARCH) {
SelectionActivity activity = mTarget.get();
activity.makeAjaxRequest(mSearchText.trim());
}
}
}
现在您需要为您的搜索编辑文本添加文本更改侦听器
searchView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mSearchText = searchView.getText().toString();
if (!mSearchText.trim().isEmpty()) {
handler.removeMessages(CitySelectionActivity.TRIGGER_SEARCH);
handler.sendEmptyMessageDelayed(SelectionActivity.TRIGGER_SEARCH, SelectionActivity.SEARCH_TRIGGER_DELAY_IN_MS);
} else {
suggestList.clear();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
如果您正在使用搜索栏,只需执行此操作,
lv.setTextFilterEnabled(true);
但我建议您使用 EditText
而不是搜索栏,如果您同意这样做 EditText
edittext = (EditText) findViewById(R.id.edittext);
edittext.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
Search_Activity.this.adapter.getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
希望对您有所帮助。
我正在尝试使用 link http://developer.android.com/guide/topics/search/search-dialog.html.
在我的 Android 应用程序中实现搜索功能它只能搜索按下搜索按钮时输入的文本。但是当搜索栏中的文本发生变化时,它无法执行搜索。我想实现那种功能,就像在 Android 手机的 "People" 或 "Contact" 应用程序中一样。
我曾多次尝试搜索此内容,但找不到任何 link。如果有人可以将我指向那些 link,那将很有用。提前致谢。
编辑:
我只在 MainActivity 中实现了搜索功能。 MainActivity.java 的代码:
findViewById(R.id.id1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onSearchRequested();
}
});
Android 清单:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<action android:name="android.intent.action.SEARCH" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
<meta-data
android:name="android.app.searchable"
android:resource="@xml/activity_search" />
</activity>
首先你需要在你的 activity 中有处理程序:
private static class SearchHandler extends Handler {
private WeakReference<CitySelectionActivity> mTarget;
SearchHandler(CitySelectionActivity target) {
mTarget = new WeakReference<>(target);
}
public void setTarget(CitySelectionActivity target) {
mTarget.clear();
mTarget = new WeakReference<>(target);
}
@Override
public void handleMessage(final Message msg) {
if (msg.what == CitySelectionActivity.TRIGGER_SEARCH) {
SelectionActivity activity = mTarget.get();
activity.makeAjaxRequest(mSearchText.trim());
}
}
}
现在您需要为您的搜索编辑文本添加文本更改侦听器
searchView.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mSearchText = searchView.getText().toString();
if (!mSearchText.trim().isEmpty()) {
handler.removeMessages(CitySelectionActivity.TRIGGER_SEARCH);
handler.sendEmptyMessageDelayed(SelectionActivity.TRIGGER_SEARCH, SelectionActivity.SEARCH_TRIGGER_DELAY_IN_MS);
} else {
suggestList.clear();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
如果您正在使用搜索栏,只需执行此操作,
lv.setTextFilterEnabled(true);
但我建议您使用 EditText
而不是搜索栏,如果您同意这样做 EditText
edittext = (EditText) findViewById(R.id.edittext);
edittext.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
Search_Activity.this.adapter.getFilter().filter(s);
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
希望对您有所帮助。