处理键盘输入,键盘的可见性,UI响应方式

主要有以下三点:
  • 修改输入法类型 ;
  • 输入法可见性;
  • 支持键盘导航 ;
1.修改输入法的类型:
  • 有时在设置输入框的时候需要规定输入的数据类型,如Email地址,电话号码,或者纯文本,这样做可以让系统展示更为合适的软输入法(比如虚拟键盘),在这种情况下就可以去在XML文件中修改属性设置android:inputType="",可以选择自己需要的数据类型,如输入密码:android:inputType="textpassword"
<EditText
    android:id="@+id/search"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="@string/search_hint"
    android:inputType="textpassword" />
  • inputType允许我们为输入法制定不同的行为,有几种可供选择的值在android:inputType的属性中,可以进行值的组合来实现特定的输入法外观和附加的行为。如果文本框是用于基本的文本输入那么我们可以使用“textAutoCorrect”属性设置,来开启自动拼写修正。
<EditText
    android:id="@+id/message"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType=
        "textCapSentences|textAutoCorrect"
    ... />
  • 很多的键盘底部会给用户提供适合的动作按钮来触发当前文本的操作,默认的情况下使用的是next,如果我们要指定适合的文本框额外动作,比如: send ,search。我们可以这样设置属性: android:imeOptions="actionSend" 通过“imeOptions”设置相关属性 actionSend” 或 “actionSearch”,(如果文本输入框允许多行文本,如:android : inputType= “textMultiLine”,在这种情况下动作按钮是回车换行)
  • 对指定的额外动作的监听操作:
    我们可以通过EditText节点定义EditText.OnEditorActionListener来监听动作按钮的按压。在监听器中响应EditorInfo类中定义的适合的IMEactionID,比如IME_ACTION_SEND 代码如下:
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;
    }
})
2.修改输入法的类型:
  • 在Activity启动是显示输入法;
    在Activity启动是焦点会放在第一个Edittext文本输入框,但有的时候需要在启动的时候就显示键盘输入,比如在登录界面的时候,默认显示输入法:为了在activity启动时显示输入法,添加 android:windowSoftInputMode 属性到 节点中,并将该属性的值设为 “stateVisible”。如下:
<application ... >
    <activity
        android:windowSoftInputMode="stateVisible" ... >
        ...
    </activity>
    ...
</application>
  • 在需要的时候显示输入法;
    如果我们要在Activity的某个方法中显示输入法的时候,需要通过 InputMethodManager 来实现。
    举例来说,下面的方法调用了一个需要用户填写文本的View,调用了 requestFocus() 来获取焦点,然后调用 showSoftInput() 来打开输入法。
public void showSoftKeyboard(View view) {
    if (view.requestFocus()) {
        InputMethodManager imm = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
    }
}
  • 指定UI的响应方式
    当输入法显示在屏幕上时,会减少 app UI 中的可用空间。系统会决定如何调整 UI 可见的部分,但是这样做不一定正确。为了确保应用的最佳表现,我们应该在 UI 的剩余空间中展示我们想要展示的系统界面。
    我们可以在activity中声明合适的处理方法,可以在 manifest 文件的 节点中使用 android:windowSoftInputMode 属性,并将该属性的值设为”adjustResize”。
    举例来说,为了确保系统会在可用空间中重新调整布局的大小——确保所有的布局内容都可以被使用(可能需要滑动)——使用 “adjustResize”:
<application ... >
    <activity
        android:windowSoftInputMode="adjustResize" ... >
        ...
    </activity>
    ...
</application>

//我们可以结合上述调整说明和初始化输入法可见性说明:

    <activity
        android:windowSoftInputMode="stateVisible|adjustResize" ... >
        ...
    </activity>

如果 UI 中包含用户可能需要在文本输入时立即执行的事情,那么使用 “adjustResize” 是很重要的。例如,如果我们使用相对布局(relative layout)在屏幕底部放置一个按钮,用 “adjustResize” 来重新调整大小,使得按钮栏出现在输入法上方。

#####3.支持键盘导航(Tab键) :

  • 当用户使用键盘上的Tab键导航我们的应用时,系统会根据组件在布局中的显示顺序,在组件之间传递焦点。如果我们使用相对布局(relativelayout),例如,在屏幕上的组件顺序与布局文件中组件的顺序不一致,那么我们可能需要手动指定焦点顺序。

    举例来说,在下面的布局文件中,两个对齐右边的按钮和一个对齐第二个按钮左边的文本框。为了把焦点从第一个按钮传递到文本框,然后再传递到第二个按钮,布局文件需要使用属性
    android:nextFocusForward,清楚地为每一个可被选中的组件定义焦点顺序:

   <RelativeLayout ...>
       <Button
           android:id="@+id/button1"
           android:layout_alignParentTop="true"
           android:layout_alignParentRight="true"
           android:nextFocusForward="@+id/editText1"
           ... />
       <Button
           android:id="@+id/button2"
           android:layout_below="@id/button1"
           android:nextFocusForward="@+id/button1"
           ... />
       <EditText
           android:id="@id/editText1"
           android:layout_alignBottom="@+id/button2"
           android:layout_toLeftOf="@id/button2"
           android:nextFocusForward="@+id/button2"
           ...  />
       ... </RelativeLayout> 

现在焦点从 button1 到 button2 再到 editText1,改成了按照在屏幕上出现的顺序:从 button1 到
editText1 再到 button2。
- 用户也能够使用键盘上的方向键在我们的app中导航(这种行为与在D-pad和轨迹球中的导航一致)。系统提供了一个最佳猜测:根据屏幕上 view 的布局,在给定的方向上,应该将交掉放在哪个 view 上。然而有时,系统会猜测错误。

当在给定的方向进行导航时,如果系统没有传递焦点给合适的 View,那么指定接收焦点的 view 来使用如下的属性:

    android:nextFocusUp
    android:nextFocusDown
    android:nextFocusLeft
    android:nextFocusRight

当用户导航到那个方向时,每一个属性指定了下一个接收焦点的 view,如根据 view ID 来指定。举例来说:

<Button
    android:id="@+id/button1"
    android:nextFocusRight="@+id/button2"
    android:nextFocusDown="@+id/editText1"
    ... />
<Button
    android:id="@id/button2"
    android:nextFocusLeft="@id/button1"
    android:nextFocusDown="@id/editText1"
    ... />
<EditText
    android:id="@id/editText1"
    android:nextFocusUp="@id/button1"
    ...  />

希望对大家有所帮助!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java GUI 中的键盘输入事件,可以通过实现 KeyListener 接口来实现。Keylistener 接口提供了三个方法,分别是 keyPressed(KeyEvent e)、keyReleased(KeyEvent e)、keyTyped(KeyEvent e)。当用户按下、释放或输入一个按键时,Java 会自动调用这些方法。 例如,当用户按下键盘上的某个键时,会触发 keyPressed(KeyEvent e) 方法。在方法中,可以通过 e.getKeyCode() 方法获取用户按下的键的 ASCII 码,从而进行相应的处理。 下面是一个示例代码: ``` import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JFrame; import javax.swing.JPanel; public class KeyInputTest extends JFrame implements KeyListener { public KeyInputTest() { JPanel panel = new JPanel(); panel.addKeyListener(this); add(panel); setSize(200, 200); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new KeyInputTest(); } @Override public void keyPressed(KeyEvent e) { System.out.println("Key Pressed: " + e.getKeyCode()); } @Override public void keyReleased(KeyEvent e) { System.out.println("Key Released: " + e.getKeyCode()); } @Override public void keyTyped(KeyEvent e) { System.out.println("Key Typed: " + e.getKeyChar()); } } ``` 在这个示例中,我们创建了一个 JFrame 窗口,并在其中添加了一个 JPanel。然后,我们实现了 KeyListener 接口,并重写了三个方法。在构造方法中,我们将 JPanel 的键盘事件监听器设置为自己,并将窗口设置为可见状态。当用户按下、释放或输入一个键时,Java 会自动调用相应的方法,在方法中我们可以根据用户的操作进行相应的处理

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值