在Action Bar Sherlock的崩溃操作中隐藏键盘自动完成不起作用

时间:2012-06-28 18:07:38

标签: android

我有一个应用程序,可在操作栏中实现自动完整文本视图。我正在使用Action Bar Sherlock,这个自动完成由标签

显示
android:actionLayout="@layout/field_search"
来自xml菜单的项目的

,如下所示。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/autocomplete_menu_item"
        android:showAsAction="always|collapseActionView"
        android:actionLayout="@layout/field_search"
        android:icon="@drawable/ic_search"
    />
</menu>

单击搜索图标时,将显示该用户的键盘。当用户选择项目时,将为所选项目名称修改自动完成文本视图内容,并隐藏键盘。好吧,这部分工作正常。

不起作用的是键盘仅在自动完成点击事件时隐藏。因此,如果我单击搜索项并且不选择自动完成文本视图的项目,然后单击操作栏的主页按钮(以关闭当前活动),则键盘不会关闭。它仍然开放。

我正在设置主页按钮(操作栏)点击下面的方法:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        // Action bar back button.
        case android.R.id.home:
            onBackPressed();
            return true;
        case R.id.autocomplete_menu_item:
            initializeAutoComplete();
            return true;
        // Default.
        default:
            return super.onOptionsItemSelected(item);
    }
}

因此,调用了onBackPressed()方法。但键盘没有关闭。

然后,我尝试在onPause()方法中关闭键盘,如下所示:

@Override
protected void onPause() {
    super.onPause();

    // Closes keyboard before exit.
    if (mKeyboardShown)
        hideKeyboard(mAutoComplete);
}

同样,键盘没有关闭。

打开和关闭键盘的方法如下所示:

/**
 * Shows the keyboard.
 * 
 * @param view
 */
public void showKeyboard(View view) {
    Context context = view.getContext();
    InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
}

/**
 * Hides the keyboard.
 * 
 * @param view
 */
public void hideKeyboard(View view) {
    Context context = view.getContext();
    InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}

管理自动完成的方法如下所示。

/**
 * Calls the auto complete text view.
 */
public boolean initializeAutoComplete() {
    if (mAutoComplete == null) return false;

    // Cleans text.
    mAutoComplete.setText("");

    // Invoke virtual keyboard.
    mAutoComplete.requestFocus();
    showKeyboard(mAutoComplete);
    mKeyboardShown = true;

    // Creates an array adapter to display the school units from the auto complete text view.
    final AutoCompleteAdapter adapter = new AutoCompleteAdapter(this, mList);

    // Sets the click listener of the auto complete text view, to show the keyboard when the auto complete
    // text view has shown the keyboard and this keyboard was closed (so the auto complete text view is been
    // shown, but the keyboard don't, so we need to show it).
    mAutoComplete.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            showKeyboard(mAutoComplete);
            mKeyboardShown = true;
        }
    });

    // Sets the click listener of the auto complete text view, to set the adapter. 
    mAutoComplete.setOnKeyListener(new OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // Populate list with our static array of titles.
            mAutoComplete.setAdapter(adapter);

            return false;
        }
    });

    // Sets the item click listener of the auto complete text view, to set the auto complete text view name,
    // hide the keyboard, and hide the auto complete drop down.
    mAutoComplete.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            // Get id of the unit from the adapter tag.
            Integer nameId = (Integer)view.getTag();

            // Get clicked id of the auto complete text view.
            Data data = getDataById(nameId);
            if (data != null) mAutoComplete.setText(data.getName());
            else mAutoComplete.setText("Data not found.");

            // Hide keyboard and hide auto complete drop down.
            hideKeyboard(mAutoComplete);
            mKeyboardShown = false;
            mAutoComplete.setDropDownHeight(0);
        }
    });

    return true;
}

因此,每次调用showKeyboard()时都会显示键盘,但只有在自动完成文本视图的click事件中调用hideKeyboard()时才会隐藏键盘。

似乎hideKeyboard()仅在调用click事件时获取“window token”。但我需要在需要时关闭键盘,而不仅仅是点击事件。

在这个应用程序中有两个活动:MainActivity和AutoCompleteActivity。下面我显示1个图像分为6帧(从左到右/从上到下),显示以下操作:

Image Link

  1. 输入AutoCompleteActivity。
  2. 点击搜索图标(此处调用键盘)。
  3. 键入一些文本后,自动完成显示适配器找到的内容。
  4. 点击自动完成后显示的项目后,自动完成的文本内容将更新为所选项目的名称(在这种情况下,“Apple”为白色)。
  5. 单击操作栏后退按钮后,自动完成文本视图将被隐藏,而不是键盘,甚至是调用onBackPressed()(当调用onOptionsItemSelected()时)。
  6. 再次按下操作栏后退按钮,我们回到MainActivity。但即使调用了AutoCompleteActivity的onPaused(),键盘仍保留在屏幕上。怎么会发生这种情况?
  7. 我如何致电解决此问题?

1 个答案:

答案 0 :(得分:0)

当我按下操作栏的后退按钮时关闭键盘

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    System.out.println("itemid: " + item.getItemId());
    switch (item.getItemId()) {
    case MENU_SEARCH:

        item.setActionView(R.layout.searchedittext);
        filterEdit = (EditText) item.getActionView().findViewById(
                R.id.filtrar2);

        //Listener que se encarga de registrar los eventos de cuando se expande y se contrae la barra de busqueda en la actionbar
        item.setOnActionExpandListener(new OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                // TODO Auto-generated method stub
                return true;
            }

            //Cerramos el teclado al contraer la barra de busqueda
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                // TODO Auto-generated method stub
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(
                        filterEdit.getWindowToken(), 0);

                return true;
            }
        });

        break;
    case android.R.id.home:

        break;

    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}