单击后退按钮可降低软键盘并同时退出 activity

one back-button click lowers a soft-keyboard and exits activity at the same time

我在我的 ActivityB 中使用清单中的这些行启动我的软键盘

<activity android:name=".ActivityB"
  android:label="@string/title_activity_activity_b"
  android:windowSoftInputMode="stateAlwaysVisible" >
</activity>

现在我希望当我按下后退按钮时我立即退出(完成)activity。我只想按一次后退按钮退出 activity。

现在我必须先按一次后退按钮降低软键盘,然后再按一次后退按钮退出activity。

这可能吗?我该怎么做?我尝试了该站点的各种常用技术,但其中 none 有效。我用LG L50做开发

编辑:我正在扩展 activity 而不是 appcompatactivity

编辑 2:程序现在可以运行了,这是代码

MainActivity.java

public class MainActivity extends Activity  {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
}}

MyEditText.java

package com.example.actionbarimagetest;

import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;

public class MyEditText extends EditText implements OnClickListener {

    public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);

    }

    public MyEditText(Context context) {
        super(context);

    }

    public MyEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }

    public void FlashBorder()
    {
        //do some custom action
    }
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        EditText txt = (EditText) v;
        txt.selectAll();
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            System.out.println("KEYCODE BACK");
            ((Activity)getContext()).finish();
            return true;
        }
        return super.onKeyPreIme(keyCode, event);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <com.example.actionbarimagetest.MyEditText
        android:id="@+id/edtTaskName"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>
</LinearLayout>

只需覆盖 activity 方法并显式完成

@Override
public void onBackPressed() {
finish();
}

已更新2

是的,这不适用于这种情况。但我尝试了几种解决方案,其中一种确实有效。您需要扩展 EditText 并覆盖方法:

@Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
            ((Activity)getContext()).finish();
            return true;
        }
        return super.onKeyPreIme(keyCode, event);
    }

注: 不要忘记用新的 class

替换布局 xml 中之前的 EditText

Activity.onBackPressed() 不会工作,因为它是在(如果)没有其他东西处理后退按钮(IME 处理)之后调用的。

改写 Activity.dispatchKeyEvent()

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
        finish();
        return true;
    }
    return super.dispatchKeyEvent(event);
}

随时随地在您的后退按钮上调用以下函数:

 yourMethod()   
    {
// close keyboard
    InputMethodManager mgr = (InputMethodManager) TempActivity.this.getSystemService(Context.INPUT_METHOD_SERVICE);
                mgr.hideSoftInputFromWindow(searchBox.getWindowToken(), 0);

    //close activity
    YourActivity.finish(); 
 }

对于 android 设备的反压,请执行以下操作:

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub

yourMethod();
YourActivity.finish();
    }