2014-02-05 4 views
1

В настоящее время я сталкиваюсь с необычной проблемой с SearchView в ActionBar, особенно на Samsung Galaxy Tab Devices.SearchView Focus на Samsung Galaxy Tab (Jelly Bean)

Приложение имеет стандартный ActionBar (не Шерлок) и отображает SearchView. Этот вид предназначен для того, чтобы быть видимым во все времена. И это прекрасно работает.

Проблема возникает после выключения Soft-Keyboard в SearchView. На устройствах Nexus (4.4) или Asus (4.0) SearchView теряет Focus. На Galaxy Tab этого не происходит.

Если вы установили прослушиватель в SearchView с помощью «setOnQueryTextFocusChangeListener», он вызывается только при запросе фокуса. Но нет, когда пользователь отклоняет Клавиатуру. (Это также относится только к этим материалам Galaxy). При использовании «clearFocus()» программно оба события отображаются и запускаются.

Это поведение делает с помощью приложения действительно страшно: 1) Введите текст в SearchView 2) Отклонить Keyboard 3) Откройте меню из панели действий (...) 4) меню Dismiss без выбора записи => Клавиатура сдвигается вверх и SearchView фокусируется

Любые идеи? Мы не хотим писать собственную реализацию вещей, которые должны быть ядром Android.

Вот изображение, в котором вы можете четко видеть, что в SearchView все еще есть Focus после того, как пользователь отклонил клавиатуру.

After Keyboard Dismissed by User

Я создал некоторые небольшие демо-приложение, которое может помочь вам понять, что я сделал.

MainActivity общественный класс MainActivity расширяет активность {

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> 

ответ

0

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

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

где item является пункт меню вы нажали на

Смежные вопросы