SearchView专注于三星Galaxy Tab(果冻豆)

时间:2014-02-05 14:50:06

标签: android keyboard focus samsung-mobile searchview

目前我在ActionBar上遇到一个奇怪的问题,特别是三星Galaxy Tab设备。

该应用程序有一个标准的ActionBar(而不是Sherlock)并显示一个SearchView。此视图旨在随时可见。这也很有效。

在SearchView中解除软键盘后出现问题。在Nexus(4.4)或华硕设备(4.0)上,SearchView失去了Focus。在Galaxy Tab上,这不会发生。

如果使用“setOnQueryTextFocusChangeListener”将侦听器设置为SearchView,则仅在请求焦点时调用它。但不是,当用户解雇键盘时。 (这也仅限于这些Galaxy Stuff)。以编程方式使用“clearFocus()”时,会显示并触发两个事件。

这些行为使得使用该应用程序非常糟糕: 1)在SearchView中输入一些文本 2)关闭键盘 3)从操作栏打开菜单(...) 4)在不选择条目的情况下关闭菜单 =>键盘向上滑动,SearchView聚焦

有什么想法吗?我们不想编写自己的实现,这应该是Android核心。

这是一个图像,您可以清楚地看到,在用户取消键盘后,SearchView仍然具有焦点。

After Keyboard Dismissed by User

我创建了一些小型演示应用程序,可以帮助您了解我的所作所为。

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>

1 个答案:

答案 0 :(得分:0)

试试这个:

item

其中{{1}}是您点击的菜单项