Android - не удается найти TextView внутри SearchWidget при использовании библиотеки поддержки Android
Я использовал следующий фрагмент, чтобы найти TextView внутри виджета SearchView.
int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null);
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(autoCompleteTextViewID);
Однако при переходе на android.support.v7.appcompat
поддержка библиотеки, она больше не работает.
Я думаю, это потому, что библиотека поддержки не использует android:
префикс для "android:id/search_src_text", но я понятия не имею, что это должно быть. Я старался
getResources().getIdentifier("android.support.v7.appcompat:id/search_src_text", null, null);
PS Больше фрагментов кода:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// this xml has funshion:actionViewClass="android.support.v7.widget.SearchView"
getMenuInflater().inflate(R.menu.search_activity_actions_v7, menu);
android.support.v7.widget.SearchView searchView = (android.support.v7.widget.SearchView)
MenuItemCompat.getActionView(menu.findItem(R.id.action_search_v7));
if (searchView==null){
FSLogcat.e(TAG, "searchView is null!");
}else{
SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
searchView.setIconifiedByDefault(false);
//searchView.requestFocus();
searchView.setSubmitButtonEnabled(true);
findSearchViewTextView(searchView);
updateSearchViewText();
}
return super.onCreateOptionsMenu(menu);
}
private void findSearchViewTextView(View searchView) {
int autoCompleteTextViewID = getResources().getIdentifier("android:id/search_src_text", null, null);
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(autoCompleteTextViewID);
}
private void updateSearchViewText() {
if (mQueryTextView == null){
} else {
mQueryTextView.setText(mQuery);
}
}
Обратите внимание, что виджет SearchView затрудняет получение предложений для размещения внутри TextView.
// in SearchAutoComplete
// /**
// * We override this method to avoid replacing the query box text when a
// * suggestion is clicked.
// */
// @Override
// protected void replaceText(CharSequence text) {
// }
ОБНОВЛЕНИЕ: необходимость манипулирования SearchWidget наступила после того, как SearchResultsActivity получила SearchWidget как SearchResultsActivity. Хотя, возможно, это должно быть реализовано как одно действие на следующей итерации, для текущей версии, которая должна появиться на этой неделе, мне просто нужно решить проблему использования, т.е. убедиться, что TextView внутри SearchWidget в SearchResultsActivity всегда имеет последний запрос.
То есть критический код, если он сломается, он будет переписан, но определенно не путем клонирования стандартного виджета. Должен быть другой путь.
3 ответа
Как предложил Педро Оливейра
mQueryTextView = (AutoCompleteTextView) searchView.findViewById(R.id.search_src_text);
один вкладыш просто работал.
котлин одна линия
mQueryTextView = findViewById<AutoCompleteTextView>(androidx.appcompat.R.id.search_src_text)
Вы можете использовать Resource#getSystem, чтобы получить представление
Resources.getSystem().getIdentifier("search_src_text",
"id", "android")