完成Android后退按钮上的活动,即使打开软键盘也是如此

时间:2017-08-18 01:34:14

标签: android back

在我的活动中,软键盘应该或多或少总是打开。因此,当用户按下后退按钮时,活动应该正常完成。但是,默认的Android行为是在打开时关闭键盘。这使得用户必须单击两次才能退出活动。如何覆盖此行为,以便在按下后退按钮时活动始终完成,即使软键盘打开?有一些简单的方法可以做到吗?

我确信这是一个常见的问题,但我没有找到这个直接的问题。

4 个答案:

答案 0 :(得分:1)

试试这个。

mEditText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            finish();
            return false;
        }
});

您可以隐藏键盘并完成活动。

如果你使用Dialog,你可以这样做。

 mDialog.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                if (isShowDialog) {
                    isShowDialog = false;
                    mDialog.dismiss();
                    context.finish();
                }
            }
            return false;
        }
});

注意:它也可以在Dialog.Dismiss对话框中使用并执行某些操作。您可以使用vkeyCodeevent。它可以被大多数人使用。

答案 1 :(得分:1)

我有同样的情况。我尝试了很多方法,最后我得到了解决方案。在这里,我将与您分享。我已经使用CustomEditText解决了这个问题。

<强> CustomEditText.Java

public class CustomEditText extends android.support.v7.widget.AppCompatEditText {


    public CustomEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    OnKeyPreImeListener onKeyPreImeListener;

    public void setOnKeyPreImeListener(OnKeyPreImeListener onKeyPreImeListener) {
        this.onKeyPreImeListener = onKeyPreImeListener;
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
            if(onKeyPreImeListener != null)
                onKeyPreImeListener.onBackPressed();
            return false;
        }
        return super.dispatchKeyEvent(event);
    }

    public interface OnKeyPreImeListener {
        void onBackPressed();
    }
}

<强> MainActivity.Java

public class MainActivity extends BaseActivity{

       private CustomEditText editSearchMenu;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         editSearchMenu = 
         (CustomEditText)findViewById(R.id.editSearchMenu);

         //Initialise  interface
         CustomEditText.OnKeyPreImeListener onKeyPreImeListener=new CustomEditText.OnKeyPreImeListener() {
            @Override
            public void onBackPressed() {
                ((MainActivity)getActivity()).finish();
            }
        };

        editSearchMenu.setOnKeyPreImeListener(onKeyPreImeListener);

       }

}

xml文件

<com.app.helper.CustomEditText
                    android:id="@+id/editSearchMenu"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/diam5dp"
                    android:background="@drawable/custom_rounded_edittext"
                    android:drawableLeft="@drawable/ico_search"
                    android:drawablePadding="@dimen/diam20dp"
                    android:drawableStart="@drawable/ico_search"
                    android:hint="@string/M_SEARCH_HINT"
                    android:padding="@dimen/diam10dp"
                    android:textColor="@android:color/white"
                    android:textColorHint="@android:color/white"
                    android:textSize="@dimen/diam16sp" />

希望这会对你有所帮助......这适用于我测试自己的每一个设备......其他解决方案在某些设备中产生问题......还有其他一些解决方案......如果你得到了什么让我知道...

答案 2 :(得分:1)

您应该实施TextWatcher

以下是您要求的代码。

public class MainActivity extends AppCompatActivity implements TextWatcher{

    EditText editTextt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editTextt = (EditText) findViewById(R.id.editTextt);
        editTextt.addTextChangedListener(this);
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void afterTextChanged(Editable s) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(before == count + 1)
        {
            finish();
        }
    }
}

答案 3 :(得分:0)

我使用此方法隐藏键盘

//hides keyoard
    private void hideSoftKeyboard(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
    }