SearchView Focus на Samsung Galaxy Tab (Jelly Bean)

В настоящее время я сталкиваюсь со странной проблемой с 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>

person Sigi    schedule 05.02.2014    source источник


Ответы (1)


Попробуй это:

SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.clearFocus();
View focused = searchView.getFocusedChild();
if (focused != null) {
    focused.clearFocus();
}

где item — пункт меню, на который вы нажали

person marmor    schedule 29.06.2015