【问题标题】:one back-button click lowers a soft-keyboard and exits activity at the same time单击后退按钮可降低软键盘并同时退出活动
【发布时间】:2015-11-29 08:43:03
【问题描述】:

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

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

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

现在我必须先按一次返回按钮以降低软键盘,然后再次按返回按钮以退出活动。

这可能吗?我该怎么做?我尝试了这个网站的各种常用技术,但没有一个奏效。我使用 LG L50 进行开发。

编辑:我正在扩展活动而不是应用程序兼容性

编辑 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>

【问题讨论】:

    标签: android android-button back android-input-method


    【解决方案1】:

    只需覆盖活动方法并显式完成

    @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);
        }
    

    注意: 不要忘记用新的扩展类替换你以前在布局 xml 中的 EditText

    【讨论】:

    • 它不起作用。我仍然必须按两次后退按钮。我已经试过了。
    • 再次检查,它应该在那里。见developer.android.com/reference/android/widget/…, android.view.KeyEvent)
    • 我正在扩展活动而不是 appcompatactivity,也许这就是原因。
    • 扩展 EditText 类,而不是活动
    • 我扩展了 EditText 类,然后尝试了 MainActivity.finish();我得到编译错误“非静态成员完成()不能从静态上下文中引用......”
    【解决方案2】:

    无论何时何地,在您的后退按钮上调用以下函数:

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

    对于安卓设备的后压执行如下:

        @Override
        public void onBackPressed() {
            // TODO Auto-generated method stub
    
    yourMethod();
    YourActivity.finish();
        }
    

    【讨论】:

    • 这也不起作用,如果我将 YourActivity 替换为 ActivityB 我会得到非静态方法完成无法引用...
    • 然后在onpause()中调用yourMethod();
    • 我不能从任何地方调用它,因为这个方法不会编译。
    • 那我会努力为你找到更多的解决方案。
    【解决方案3】:

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

    改写Activity.dispatchKeyEvent():

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

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2021-03-23
      • 1970-01-01
      相关资源
      最近更新 更多