我想知道如果有一种方法来处理用户按压 输入 同时输入一个 EditText, 东西喜欢的onSubmit HTML事件。

还想知道,如果有一个方法可以操纵的虚拟键盘在这样一种方式"完成"的按钮被标记为别的东西(例如"走出去")和执行某些行动时,点击(再次,如onSubmit).

有帮助吗?

解决方案

我想知道如果有一个方法 处理用户按压 输入 同时 打字在一个EditText,类似的东西 该onSubmit HTML事件。

是的。

还想知道,如果有一个方法 操纵的虚拟键盘 这样一种方式"完成"的按钮 标有别的东西(例如 "走出去")和执行某一行动 点击时(同样,如onSubmit).

也是。

你会想看看的 android:imeActionIdandroid:imeOptions 属性,加上的 setOnEditorActionListener() 方法,所有上 TextView.

为改变该文本的"完成"按钮,一个自定义的字符串中,使用:

mEditText.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

其他提示

final EditText edittext = (EditText) findViewById(R.id.edittext);
edittext.setOnKeyListener(new OnKeyListener() {
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // If the event is a key-down event on the "enter" button
        if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER)) {
          // Perform action on key press
          Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
          return true;
        }
        return false;
    }
});

下面就是你要做的。它也隐藏在Android开发者的示例代码“蓝牙聊天”。更换零件大胆说是“例如” 用自己的变量和方法。

首先,导入你需要到您想要的返回按钮做一些特殊的主要活动是什么:

import android.view.inputmethod.EditorInfo;
import android.widget.TextView;
import android.view.KeyEvent;

现在,让类型TextView.OnEditorActionListener的变量为您的返回键(在这里我使用 exampleListener );

TextView.OnEditorActionListener exampleListener = new TextView.OnEditorActionListener(){

然后,你需要告诉听众关于按下返回按钮时该怎么做两件事情。它需要知道的EditText我们谈论(在这里我使用 exampleView ),然后它需要知道做什么,当按键被按下回车(这里的 example_confirm())。如果这是最后一个或唯一的EditText您的活动,它应该做同样的事情的onClick方法为您提交(或确定,确认,发送,保存等)按钮。

public boolean onEditorAction(TextView exampleView, int actionId, KeyEvent event) {
   if (actionId == EditorInfo.IME_NULL  
      && event.getAction() == KeyEvent.ACTION_DOWN) { 
      example_confirm();//match this behavior to your 'Send' (or Confirm) button
   }
   return true;
}

最后,设置收听者(最有可能在onCreate方法);

exampleView.setOnEditorActionListener(exampleListener);

硬件键盘总产量进入的事件,但软件键盘的回报不同actionIDs和空中单线EditTexts.这个代码作出响应用户每次按下输入一个EditText,这个监听器已经设定,而不论EditText或键盘类型。

import android.view.inputmethod.EditorInfo;
import android.view.KeyEvent;
import android.widget.TextView.OnEditorActionListener;

listener=new TextView.OnEditorActionListener() {
  @Override
  public boolean onEditorAction(TextView view, int actionId, KeyEvent event) {
    if (event==null) {
      if (actionId==EditorInfo.IME_ACTION_DONE);
      // Capture soft enters in a singleLine EditText that is the last EditText.
      else if (actionId==EditorInfo.IME_ACTION_NEXT);
      // Capture soft enters in other singleLine EditTexts
      else return false;  // Let system handle all other null KeyEvents
    }
    else if (actionId==EditorInfo.IME_NULL) { 
    // Capture most soft enters in multi-line EditTexts and all hard enters.
    // They supply a zero actionId and a valid KeyEvent rather than
    // a non-zero actionId and a null event like the previous cases.
      if (event.getAction()==KeyEvent.ACTION_DOWN); 
      // We capture the event when key is first pressed.
      else  return true;   // We consume the event when the key is released.  
    }
    else  return false; 
    // We let the system handle it when the listener
    // is triggered by something that wasn't an enter.


    // Code from this point on will execute whenever the user
    // presses enter in an attached view, regardless of position, 
    // keyboard, or singleLine status.

    if (view==multiLineEditText)  multiLineEditText.setText("You pressed enter");
    if (view==singleLineEditText)  singleLineEditText.setText("You pressed next");
    if (view==lastSingleLineEditText)  lastSingleLineEditText.setText("You pressed done");
    return true;   // Consume the event
  }
};

默认的外进入的关键在单线=false给出了一个弯箭头客的键盘。当单线=true在最后EditText的关键说的做,并在EditTexts之前,它它说下一步。默认情况下,这种行为是一致的所有香草,安卓,与谷歌模拟器。该scrollHorizontal属性不会出任何差异。空测试是重要的,因为响应的手机软入是留给制造商,甚至在模拟器,香草级16模拟应对的长柔进入在多线和scrollHorizontal EditTexts与actionId的下一个和一个空的事件。

我知道这是一岁,但我发现这完全适用于一个EditText。

EditText textin = (EditText) findViewById(R.id.editText1);
textin.setInputType(InputType.TYPE_CLASS_TEXT);

它防止任何东西,但文本和空间。我不能标签中, “返回”( “\ n”),或任何东西。

本页面介绍如何正确地做到这一点。

https://developer.android.com/training/keyboard-input/style.html

设置安卓imeOptions 的,那么你只检查的 actionId 在onEditorAction。所以,如果你设置imeOptions为“actionDone”,那么你会为您在onEditorAction“actionId == EditorInfo.IME_ACTION_DONE”。此外,确保设置了android:的inputType

下面从上面链接的例子是所述的EditText:

<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="text"
    android:imeOptions="actionSend" />

您也可以设置此编程方式使用 setImeOptions(INT)功能。下面是从上面的例子中链接的OnEditorActionListener:

EditText editText = (EditText) findViewById(R.id.search);
editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        boolean handled = false;
        if (actionId == EditorInfo.IME_ACTION_SEND) {
            sendMessage();
            handled = true;
        }
        return handled;
    }
});

只是作为附录乍得的反应(这工作几乎完美的我),我发现我需要对KeyEvent的动作类型添加一个检查,以防止我的代码在执行两次(一次在插入钥匙,一旦键按下事件)。

if (actionId == EditorInfo.IME_NULL && event.getAction() == KeyEvent.ACTION_DOWN)
{
    // your code here
}

请参阅 http://developer.android.com/reference/android/view /KeyEvent.html 以大约重复动作事件(保持输入键)等信息。

我有一个类似的目的。我想解决按下键盘上的“Enter”键(我想自定义),其中延伸的TextView的AutoCompleteTextView。我从上面想尽了各种办法,他们似乎工作。但我遇到了一些问题,当我切换输入型我从SwiftKey 3(但是,它完美地工作)设备(的Nexus 4 AOKP ROM)到标准的Android键盘(而不是从监听器处理我的代码,一个新的生产线在何处按“Enter”键后,输入的。我花了一段时间来处理这个问题,但我不知道这是否会在所有情况下工作,不管你使用哪种输入类型。

因此,这里是我的解决方案:

设置的TextView的输入类型属性在XML为“文本”:

android:inputType="text"

自定义键盘上的“Enter”键的标签:

myTextView.setImeActionLabel("Custom text", KeyEvent.KEYCODE_ENTER);

设置一个OnEditorActionListener到TextView的:

myTextView.setOnEditorActionListener(new OnEditorActionListener()
{
    @Override
    public boolean onEditorAction(TextView v, int actionId,
        KeyEvent event)
    {
    boolean handled = false;
    if (event.getAction() == KeyEvent.KEYCODE_ENTER)
    {
        // Handle pressing "Enter" key here

        handled = true;
    }
    return handled;
    }
});

我希望这可以帮助别人,以避免我的问题,因为他们几乎使我疯了。

在您的XML中,添加imeOptions归因于EDITTEXT

<EditText
    android:id="@+id/edittext_additem"
    ...
    android:imeOptions="actionDone"
    />

然后,在Java代码,该OnEditorActionListener添加到相同的EditText

mAddItemEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(actionId == EditorInfo.IME_ACTION_DONE){
                //do stuff
                return true;
            }
            return false;
        }
    });

下面是explanation- 该imeOptions = actionDone将 “actionDone” 分配给EnterKey。在键盘的EnterKey将从“进入”到“做”的转变。因此ENTER键被按下时,就会触发这个动作,因此你会处理它。

您也可以做到这一点..

editText.setOnKeyListener(new OnKeyListener() {

            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event)
            {
                if (event.getAction() == KeyEvent.ACTION_DOWN
                        && event.getKeyCode() ==       KeyEvent.KEYCODE_ENTER) 
                {
                    Log.i("event", "captured");

                    return false;
                } 

            return false;
        }
    });
     password.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if(event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
                submit.performClick();
                return true;
            }
            return false;
        }
    });

工作非常正常,我点击 此外隐藏键盘

<强>完美的工作

public class MainActivity extends AppCompatActivity {  
TextView t;
Button b;
EditText e;

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

    b = (Button) findViewById(R.id.b);
    e = (EditText) findViewById(R.id.e);

    e.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

            if (before == 0 && count == 1 && s.charAt(start) == '\n') {

                b.performClick();
                e.getText().replace(start, start + 1, ""); //remove the <enter>
            }

        }
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
        @Override
        public void afterTextChanged(Editable s) {}
    });

    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            b.setText("ok");

        }
    });
}

}

<强>完美的工作

首先,你必须设置的EditText听按键

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

    // Set the EditText listens to key press
    EditText edittextproductnumber = (EditText) findViewById(R.id.editTextproductnumber);
    edittextproductnumber.setOnKeyListener(this);

}

其次,在将按键定义事件,例如,事件来设置的TextView的文本:

@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
    // TODO Auto-generated method stub

 // Listen to "Enter" key press
 if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER))
 {
     TextView textviewmessage = (TextView) findViewById(R.id.textViewmessage);
     textviewmessage.setText("You hit 'Enter' key");
     return true;
 }

return false;   

}

最后,不要忘了进口的EditText,TextView的,OnKeyListener,KeyEvent的以最高:

import android.view.KeyEvent;
import android.view.View.OnKeyListener;
import android.widget.EditText;
import android.widget.TextView;
editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId != 0 || event.getAction() == KeyEvent.ACTION_DOWN) {
                // Action
                return true;
            } else {
                return false;
            }
        }
    });

XML

<EditText
        android:id="@+id/editText2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="@string/password"
        android:imeOptions="actionGo|flagNoFullscreen"
        android:inputType="textPassword"
        android:maxLines="1" />

此应该工作

input.addTextChangedListener(new TextWatcher() {

           @Override
           public void afterTextChanged(Editable s) {}

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

           @Override    
           public void onTextChanged(CharSequence s, int start,
             int before, int count) {
               if( -1 != input.getText().toString().indexOf( "\n" ) ){
                   input.setText("Enter was pressed!");
                    }
           }
          });

这对LG Android手机工作正常。它可以防止ENTER和其它特殊字符将被解释为普通字符。 NextDone按钮会自动出现和ENTER按预期工作。

edit.setInputType(InputType.TYPE_CLASS_TEXT);

下面是您可以抛入Utils或当用户点击一个硬件或软件键盘上的回车键,将执行代码Keyboards类简单的静态函数。这是@ earlcasper的出色答卷的修改版本

 /**
 * Return a TextView.OnEditorActionListener that will execute code when an enter is pressed on
 * the keyboard.<br>
 * <code>
 *     myTextView.setOnEditorActionListener(Keyboards.onEnterEditorActionListener(new Runnable()->{
 *         Toast.makeText(context,"Enter Pressed",Toast.LENGTH_SHORT).show();
 *     }));
 * </code>
 * @param doOnEnter A Runnable for what to do when the user hits enter
 * @return the TextView.OnEditorActionListener
 */
public static TextView.OnEditorActionListener onEnterEditorActionListener(final Runnable doOnEnter){
    return (__, actionId, event) -> {
        if (event==null) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // Capture soft enters in a singleLine EditText that is the last EditText.
                doOnEnter.run();
                return true;
            } else if (actionId==EditorInfo.IME_ACTION_NEXT) {
                // Capture soft enters in other singleLine EditTexts
                doOnEnter.run();
                return true;
            } else {
                return false;  // Let system handle all other null KeyEvents
            }
        } else if (actionId==EditorInfo.IME_NULL) {
            // Capture most soft enters in multi-line EditTexts and all hard enters.
            // They supply a zero actionId and a valid KeyEvent rather than
            // a non-zero actionId and a null event like the previous cases.
            if (event.getAction()==KeyEvent.ACTION_DOWN) {
                // We capture the event when key is first pressed.
                return true;
            } else {
                doOnEnter.run();
                return true;   // We consume the event when the key is released.
            }
        } else {
            // We let the system handle it when the listener
            // is triggered by something that wasn't an enter.
            return false;
        }
    };
}

在文本框的inputType必须为了什么CommonsWare说工作中text。只是尝试这一切,之前没有的inputType审判并没有什么工作,输入注册保持软输入。 inputType = text之后,一切,包括setImeLabel工作。

示例: android:inputType="text"

   final EditText edittext = (EditText) findViewById(R.id.edittext);
    edittext.setOnKeyListener(new OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            // If the event is a key-down event on the "enter" button
            if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                    (keyCode == KeyEvent.KEYCODE_ENTER)) {
                // Perform action on key press
                Toast.makeText(HelloFormStuff.this, edittext.getText(), Toast.LENGTH_SHORT).show();
                return true;
            }
            return false;
        }
    });

在编辑器键入此代码,以便它可以导入必要的模块。

 query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
            if(actionId == EditorInfo.IME_ACTION_DONE
                || actionId == EditorInfo.IME_ACTION_DONE
                    || keyEvent.getAction() == KeyEvent.ACTION_DOWN
                        || keyEvent.getAction() == KeyEvent.KEYCODE_ENTER) {

                // Put your function here ---!

                return true;

            }
            return false;
        }
    });

向一个<回车>响应于一个EditText一个可靠的方法是使用一个 TextWatcher ,一个 LocalBroadcastManager 广播接收器。您需要添加 V4支持库使用LocalBroadcastManager。我使用的教程在 vogella.com :7.3“本地广播事件与LocalBroadcastManager”由于其完整的简洁的代码的例子。在onTextChanged的之前的变化的的端部的变更前的索引 >;减去启动。当TextWatcher UI线程忙于更新EDITTEXT的可编辑的,所以我们发送的意图唤醒的BroadcastReceiver当UI线程完成更新EDITTEXT。

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.text.Editable;
//in onCreate:
editText.addTextChangedListener(new TextWatcher() {
  public void onTextChanged
  (CharSequence s, int start, int before, int count) {
    //check if exactly one char was added and it was an <enter>
    if (before==0 && count==1 && s.charAt(start)=='\n') {
    Intent intent=new Intent("enter")
    Integer startInteger=new Integer(start);
    intent.putExtra("Start", startInteger.toString()); // Add data
    mySendBroadcast(intent);
//in the BroadcastReceiver's onReceive:
int start=Integer.parseInt(intent.getStringExtra("Start"));
editText.getText().replace(start, start+1,""); //remove the <enter>
//respond to the <enter> here

添加这些depencendy,并且它应该工作:

import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;

此问题尚未与Butterknife仍不回答

<强>布局XML

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/some_input_hint">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/textinput"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:imeOptions="actionSend"
            android:inputType="text|textCapSentences|textAutoComplete|textAutoCorrect"/>
    </android.support.design.widget.TextInputLayout>

<强> JAVA应用

@OnEditorAction(R.id.textinput)
boolean onEditorAction(int actionId, KeyEvent key){
    boolean handled = false;
    if (actionId == EditorInfo.IME_ACTION_SEND || (key.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
        //do whatever you want
        handled = true;
    }
    return handled;
}

科特林

editTextVar?.setOnKeyListener { v, keyCode, event ->
            if((event.action == KeyEvent.ACTION_DOWN)
                && (event.keyCode == KeyEvent.KEYCODE_ENTER)){
                //Do something, such as loadJob()
                loadJob()
                return@setOnKeyListener true
            }

            false
        }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top