【问题标题】:Android - method to hide soft keyboard crashes with multiple rotationsAndroid - 通过多次旋转隐藏软键盘崩溃的方法
【发布时间】:2013-10-16 05:37:51
【问题描述】:

我正在尝试开发一个在旋转时在其 TextViews 和 EditTexts 中保留值的应用程序。当未选择 EditText 时,我还想隐藏软键盘。但是,由于某种原因,当results 可见时,hideKeyboard() 方法在多次旋转后崩溃。

以下是我的一些可能是罪魁祸首的方法:

/**
 * Detects if text boxes are not selected to hide keyboard
 * @param view - main view  
 */
private void setupUI(View view) {
   if(!(view instanceof EditText)) {
        view.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                hideKeyboard();
                return false;
            }
        });
    }
    if (view instanceof ViewGroup) {
        for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
            View innerView = ((ViewGroup) view).getChildAt(i);
            setupUI(innerView);
        }
    }
}

/**
 * Hides software keyboard
 */
private void hideKeyboard() {
        InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);
        inputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);             
}

/**
 * Saves instance state on rotation
 * @param outState - current state before rotation
 */
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("loabox", loaBox.getText().toString());
    outState.putString("lwlbox", lwlBox.getText().toString());
    outState.putString("beambox", beamBox.getText().toString());
    outState.putString("displacementbox", displacementBox.getText().toString());
    outState.putString("sabox", saBox.getText().toString());

    if (results != null && !isEmpty(mhsText) && !isEmpty(dlText) && !isEmpty(sadText) && !isEmpty(capsizeText) && !isEmpty(comfortText)) {

        outState.putInt("results", results.getVisibility());

        outState.putString("mhs", mhsText.getText().toString());
        outState.putString("dl", dlText.getText().toString());
        outState.putString("sad", sadText.getText().toString());
        outState.putString("capsize", capsizeText.getText().toString());
        outState.putString("comfort", comfortText.getText().toString());

    }
    super.onSaveInstanceState(outState);
}

/**
 * Restores previous instance state after rotation
 * @param savedInstanceState - saved previous state before rotation
 */
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    if (savedInstanceState != null) {
        loaBox.setText(savedInstanceState.getString("loabox"));
        lwlBox.setText(savedInstanceState.getString("lwlbox"));
        beamBox.setText(savedInstanceState.getString("beambox"));
        displacementBox.setText(savedInstanceState.getString("displacementbox"));
        saBox.setText(savedInstanceState.getString("sabox"));

        mhsText.setText(savedInstanceState.getString("mhs"));
        dlText.setText(savedInstanceState.getString("dl"));
        sadText.setText(savedInstanceState.getString("sad"));
        capsizeText.setText(savedInstanceState.getString("capsize"));
        comfortText.setText(savedInstanceState.getString("comfort"));   

        results.setVisibility(savedInstanceState.getInt("results", results.getVisibility()));
    }
}

setupUI() 方法在我的onCreate() 方法结束时被调用。

有人知道这里出了什么问题吗?

【问题讨论】:

  • 请将其添加到您的清单中 ''
  • 您是否将此添加到您拥有edittext的活动中。
  • 什么意思?我在清单中添加了您给我的代码行。如果您在谈论关键字this,我使用this 作为参数创建了每个EditText。仅供参考,对于我的setupUI 方法,我传入mainView,这是一个滚动视图。 mainView 包含一个嵌套的 LinearLayout (mainLayout),而后者又包含两个嵌套的 LinearLayouts (resultsbuttons)。
  • 另外,mainLayout 包含我所有的 EditText 框。

标签: java android crash android-softkeyboard screen-rotation


【解决方案1】:

请查看您的manifext文件,您可以在该标签中找到&lt;activity&gt;标签,您需要添加android:windowSoftInputMode="stateAlwaysHidden"

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 2011-02-17
    • 1970-01-01
    • 2022-12-14
    • 2011-09-20
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多