1. 程式人生 > >Android 鍵盤彈起和回落事件監聽

Android 鍵盤彈起和回落事件監聽

轉載請註明出處
http://blog.csdn.net/u014513456/article/details/54343765
Author:[email protected]
背景
在京東金融APP的登陸頁面鍵盤彈出後整個佈局上移,鍵盤彈起後,使用者仍能看到頁面全部內容,這樣的使用者體驗要好於鍵盤彈起後緊貼輸入框下側,或者鍵盤彈起後直接連輸入的區域都遮擋。

技術點
遺憾的是系統並不提供鍵盤彈起的事件監聽
1.鍵盤事件的監聽
2.佈局的移動

以下為解決方案

AndroidMainfest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="open.ppdai.com.keyboardlogin"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme
="@style/AppTheme">
<activity android:name=".MainActivity" android:windowSoftInputMode="stateAlwaysHidden|adjustResize"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name
="android.intent.category.LAUNCHER" />
</intent-filter> </activity> </application> </manifest>

以下是關鍵語句

<activity
  android:name=".MainActivity"        android:windowSoftInputMode="stateAlwaysHidden|adjustResize">

Activity

package open.ppdai.com.keyboardlogin;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
 * Author [email protected]
 * 捕捉介面鍵盤彈起動作
 * 例如 京東金融 登陸介面 在輸入框獲取焦點後鍵盤彈出把整個佈局上移
 * 鍵盤迴落後佈局也相應回落
 *
 */
public class MainActivity extends AppCompatActivity {

    private LinearLayout root_view;

    private int screenHeight = 0;
    private int keyHeight = 0;

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

    private void initView() {
        root_view = (LinearLayout) findViewById(R.id.root_view);
    }

    private void initListener() {
        root_view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
            @Override
            public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
                if (oldBottom != 0 && bottom != 0 && (oldBottom - bottom > keyHeight)) {
                    Toast.makeText(MainActivity.this,"鍵盤彈起",Toast.LENGTH_SHORT).show();
                } else if (oldBottom != 0 && bottom != 0 && (bottom - oldBottom > keyHeight)) {
                    Toast.makeText(MainActivity.this,"鍵盤落下",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void initOtherData() {
        screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
        keyHeight = screenHeight / 3;
    }

}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/root_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical"
    tools:context="open.ppdai.com.keyboardlogin.MainActivity">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="64dp"
        android:background="@mipmap/ic_launcher" />

    <EditText
        android:id="@+id/user"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:hint="username"
        android:textColorHint="#cccccc" />

    <EditText
        android:id="@+id/pass"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:hint="password"
        android:textColorHint="#cccccc" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="register!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.502" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="48dp"
        android:layout_marginTop="16dp"
        android:text="login" />
</LinearLayout>

有了監聽事件了,那剩下的就是佈局移動了,請看下篇

相關推薦

Android 鍵盤彈起回落事件

轉載請註明出處 http://blog.csdn.net/u014513456/article/details/54343765 Author:[email protected] 背景 在京東金融APP的登陸頁面鍵盤彈出後

自定義頂部標題欄事件設定

iOS系統上方的工具欄很漂亮,也很實用,下面讓我們來仿製一下吧。 首先新建一個佈局檔案title.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:/

js ios手機鍵盤彈起收起的事件

document.body.addEventListener('focusin', () => { //軟鍵盤彈起事件 console.log("鍵盤彈起") }) document.body.addEventListener('focusout', () => { //軟

android 鍵盤彈起/收起

Android soft (virtual) keyboard listener If you use Evernote android app you might have noticed, that when, on a login screen, soft keyboard gets shown

時間綁定事件

func 控制 綁定 更新 cti jquery on() function 代碼塊 一般在網頁上回有不少節點的數據是根據數據庫進行更新的,這種節點都是由js代碼控制動態生成的,那麽綁定各種事件比如點擊事件的代碼塊會比生成節點的代碼塊先執行,那後生成的節點就不會被綁定上事件

事件綁定、事件事件委托

沒有 ack cap 總結 事件類型 ava 動態 blog 關於 在JavaScript的學習中,我們經常會遇到JavaScript的事件機制,例如,事件綁定、事件監聽、事件委托(事件代理)等。 一、事件綁定 要想讓 JavaScript 對用戶的操作作出響應,首先要對

No.5一步步學習vuejs之事件組件

sage 應該 shift vuejs 進行 編譯器 add round mage 一監聽事件 可以用 v-on 指令監聽 DOM 事件,並在觸發時運行一些 JavaScript 代碼。 <div id="demo1"> <button v-on:cli

Netty事件處理(上)

事件處理 多路復用 linu 自定義事件 性能 cdn 處理請求 fancybox 客戶 陪產假結束了,今天又開始正常上班了,正好趕上米粉節活動,又要忙上一陣了,米粉節活動時間為4.03 - 4.10,有不少優惠,感興趣的可以關註mi.com或小米商城app。 今天

Netty事件處理(下)

關註 proto cte meta pro sse cti 讀取 線程模型 上一篇 介紹了事件監聽、責任鏈模型、socket接口和IO模型、線程模型等基本概念,以及Netty的整體結構,這篇就來說下Netty三大核心模塊之一:事件監聽和處理。 前面提到,Netty是一個N

事件window.history以及自定義創建事件

lac 瀏覽器 捕獲 tps details push AD his listener 1.事件監聽window.addEventListener方法: Window.addEventListener(event, function, useCapture); useC

事件計算器界面

activate 流布局 title char right source In get ole 1.事件監聽 package 事件監聽;import java.awt.*;import java.awt.event.*;public class Frame2 extend

android開發 事件

第一種:匿名內部類作為事件監聽器類  大部分時候,事件處理器都沒有什麼利用價值(可利用程式碼通常都被抽象成了業務邏輯方法),因此大部分事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適,實際上,這種形式是目前是最廣泛的事件監聽器形式。上面的程式程式碼就是匿名內部類來建

鍵盤顯示隱藏事件

軟鍵盤顯示隱藏事件監聽 現在的Android裝置很少才會有硬鍵盤,絕大多數都是軟鍵盤,而SDK和API中卻沒有軟鍵盤隱藏變化的相關事件,沒有直接支援不代表做不到。我們通過其他的方式還是可以做到監聽軟鍵盤顯示與隱藏狀態變化的。 override onKeyPreIme 當Edit

Button一些屬性幾種事件

介紹: TextView與Button是繼承關係,Button繼承自TextView。開發中一般情況下,TextView用來承載靜態文字,Button用來響應點選事件。很多人容易忽略的一點是TextVIew也有點選事件,TextView 繼承自View,點選事件是從View就有的特性,所以Tex

JQ原生JSaudio播放停止事件

music audio == img on() tex dde dev func 原生JS: function control_f(){ var audio_f = document.getElementById(‘music_f‘); var audioi

觀察者模式事件模式的區別

監聽機制 其他 不包含 機制 監聽 多態 場景 觀察者模式 特定 事件監聽模式更像是觀察者模式的進階。 觀察者模式中,‘主題’會在特定邏輯下通知所有‘觀察者’。如果這個通知不包含任何信息,那麽這種實現就是通常的觀察者模式。 如果‘主題’通知‘觀察者’的過程帶有一些<其

Android View的onClick事件

點選事件 Android中Touch事件相關內容都被封裝到 MotionEvent 中,MotionEvent 中的時間型別有按下、擡起、滑動和結束事件。這些事件都是人機互動的一個過程,按下動作指的是人手指按在手機螢幕上這個動作,擡起動作指的是人手指按下手機後擡起來這個動作

Android學習筆記1:基於事件處理過程

基於監聽的事件處理過程 記錄一:安卓介面互動處理事件的兩個方式 (1)基於監聽的事件處理 (2)基於回撥的事件處理 基於回撥的事件處理日後再寫,先學習基於監聽的事件處理 通常以下步驟: (1)例項化物件 (2)為事件源物件新增監聽器物件,例如set...List

通過點選事件 setOnClickListener 徹底理解回撥-Android

前言 老司機們對於回撥肯定熟悉得不能再熟悉了,但是新司機可能還是一臉懵逼的,我比較笨,當年懵逼了好久,看夏安明的這一篇部落格地址,雖然下邊的留言都是,寫得好!懂了懂了!但是我當時看了三遍還是不懂好嗎 - -,現在我站在我的角度,用我理解的方式給大家講解回撥,我這麼笨都理解了,聰明的新司機們肯定也

死磕Java系列之GUI 元件事件

當我們搭建好圖形介面窗體的時候,需要向窗體中加入各種元件,便於使用者操作,使用者在窗體中都會有哪些操作呢?窗體是程式與使用者可互動的介面,比如說登入介面,使用者可以輸入姓名和密碼,點選登入按鈕,登入到另一個介面,在下一個介面有更多的操作,比如說有多個選擇組成的選單,需要輸入文字的文字框,用來