현재 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에 여전히 포커스가있는 이미지가 있습니다.
난 당신이 내가 무슨 짓을했는지 이해하는 데 도움이 될 몇 가지 작은 데모 응용 프로그램을 만들었습니다.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>