2014-02-05 2 views
1

현재 Samsung Galaxy Tab Devices의 ActionBar에있는 SearchView에 이상한 문제가 있습니다.SearchView 삼성 Galaxy Tab (Jelly Bean)에 집중

앱에 표준 ActionBar (Sherlock 아님)가 있으며 SearchView가 표시됩니다. 이보기는 항상 표시됩니다. 그리고 그것도 완벽하게 작동합니다.

SearchView에서 소프트 키보드 닫기 후 문제가 나타납니다. Nexus (4.4) 또는 Asus 기기 (4.0)에서 SearchView는 포커스를 잃습니다. 갤럭시 탭에서는 이런 일이 발생하지 않습니다.

"setOnQueryTextFocusChangeListener"를 사용하여 Listener를 SearchView로 설정하면 포커스를 요청할 때만 호출됩니다. 그러나 사용자가 키보드를 닫을 때 아닙니다. (이것은 또한이 Galaxy Stuff에서만 가능합니다). "clearFocus()"를 사용하면 프로그래밍 방식으로 두 이벤트가 모두 표시되고 실행됩니다.

이러한 행동은 정말 끔찍 응용 프로그램을 사용합니다 : 1) 항목 을 선택하지 않고 작업 표시 줄 (...) 4) 메뉴를 해제에서 키보드 3) 열기 메뉴를 해제) SearchView 2에 텍스트를 입력 => 키보드가 위로 올라와 SearchView에 포커스가 있습니다

아이디어가 있으십니까? 우리는 안드로이드 코어가 되어야만하는 것들에 대한 우리 자신의 구현을 작성하고 싶지 않습니다.

사용자가 키보드를 닫은 후에도 SearchView에 여전히 포커스가있는 이미지가 있습니다.

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

,369 활동을 확장
<?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

이 시도 : item 당신이

클릭 메뉴 항목은

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

관련 문제