В настоящее время я сталкиваюсь со странной проблемой с SearchView в панели действий, особенно на устройствах Samsung Galaxy Tab.
Приложение имеет стандартный ActionBar (не Sherlock) и отображает SearchView. Это представление должно быть видимым в любое время. И это тоже отлично работает.
Проблема возникает после удаления программной клавиатуры в SearchView. На устройствах Nexus (4.4) или Asus (4.0) SearchView теряет фокус. На Galaxy Tab такого не происходит.
Если вы установите прослушиватель для SearchView с помощью «setOnQueryTextFocusChangeListener», он вызывается только тогда, когда он запрашивает фокус. Но не тогда, когда пользователь закрывает клавиатуру. (Это также относится только к этим Galaxy Stuff). При программном использовании «clearFocus()» оба события отображаются и запускаются.
Такое поведение делает использование приложения действительно ужасным: 1) Введите текст в SearchView 2) Закройте клавиатуру 3) Откройте меню из панели действий (...) 4) Закройте меню без выбора записи => Клавиатура скользит вверх, а SearchView сфокусирован
Есть идеи? Мы не хотим писать собственную реализацию вещей, которые должны быть ядром Android.
Вот изображение, на котором вы можете ясно видеть, что SearchView все еще имеет фокус после того, как пользователь убрал клавиатуру.
Я создал небольшое демонстрационное приложение, которое поможет вам понять, что я сделал.
Открытый класс MainActivity MainActivity расширяет Activity {
protected static final String TAG = "MainActivity";
private SearchView mSearchView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
mSearchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
mSearchView.setQueryHint("Search something");
mSearchView.setIconifiedByDefault(false);
mSearchView.setOnQueryTextFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
Log.d(TAG, "Focus is: " + hasFocus);
Toast.makeText(MainActivity.this, "Focus is: " + hasFocus, Toast.LENGTH_SHORT).show();
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_browse:
//Just find out how focus changes if another activity is launched
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
startActivity(browserIntent);
return true;
case R.id.action_setFocus:
if (mSearchView != null) {
mSearchView.requestFocus();
}
return true;
case R.id.action_clearFocus:
if (mSearchView != null) {
mSearchView.clearFocus();
}
return true;
default:
if (mSearchView != null) {
mSearchView.clearFocus();
}
return super.onOptionsItemSelected(item);
}
}
}
Activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:descendantFocusability="beforeDescendants"
android:focusable="true"
android:focusableInTouchMode="true"
tools:context=".MainActivity" >
<EditText
android:id="@+id/testEditText"
android:layout_width="300dp"
android:layout_height="wrap_content"
android:hint="@string/hello_world">
</EditText>
</RelativeLayout>
main.xml (меню)
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/menu_search"
android:showAsAction="always"
android:focusable="false"
android:actionViewClass="android.widget.SearchView" />
<item
android:id="@+id/action_browse"
android:orderInCategory="100"
android:showAsAction="always"
android:title="Browse"/>
<item
android:id="@+id/action_setFocus"
android:orderInCategory="100"
android:showAsAction="never"
android:title="Set Focus"/>
<item
android:id="@+id/action_clearFocus"
android:orderInCategory="100"
android:showAsAction="never"
android:title="Clear Focus"/>
</menu>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<uses-permission
android:name="android.permission.INTERNET" />
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.searchviewtest.MainActivity"
android:windowSoftInputMode="stateAlwaysHidden"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>