android 隱藏鍵盤時ui延遲恢復,android 軟鍵盤的顯示與隱藏問題的研究

在android中,常常會和輸入法的軟件鍵盤交互。在Manifest文件中,系統給activity的一個屬性-windowSoftInputMode來控制輸入法的顯示方式。

該屬性提供了Activity的window與軟鍵盤的window交互的方式。這里的屬性設置有雙方面的影響:

1.軟鍵盤的顯示與隱藏。-當Activity界面成為用戶的焦點時,或隱藏或顯示。

2。

對Activty的主window窗體進行調整。或者將Activity的window窗體調小以便為軟鍵盤騰出空間,或者當Activity的部分window被軟件蓋住時,移動Activity的內容以便用戶可以看到當前的焦點。

你至少要從下列屬性值選取一項對其設置,要么是”state...“,要么是”adjust...“。

你能夠設置多個值。設置不同的屬性值。要用|進行分開。

比方:

以下是對屬性的值的描寫敘述。

描寫敘述

”stateUnSpecified“

不指定軟件的狀態(顯示或隱藏)。系統會依據主題中的設置來選擇對應的狀態。 該屬性軟鍵盤的默認設置。

”stateUnchnaged“

總是保持上次軟鍵盤的狀態。當Activity進入到最前端時,不論是它上次它是顯示或隱藏。保持不變。

”stateHidden“

當用戶進入目標Activity時。軟鍵盤保持隱藏狀態。這里的Activity是用戶是向前進入Activity,而不是因為退出其他Activity退回到目標Activity。

”stateVisible“

僅僅有條件合適(當用戶前進進入到Activity的主window),就會顯示鍵盤

”stateAlawaysVisible“

當用戶選擇進入目標Activity時。軟鍵盤被設置為可見的。這里的Activity是用戶向前進入的Activity,而不是因為退出其他Activity而回到目標Activity

"adjustUnspecified"

不指定是否去調整Activity的界面。或者調整Activity窗體的大小以便為軟鍵盤騰出空間或者移動窗體的內容來屏幕上當前的焦點可見。系統會自己主動選擇當中一種模式,這依賴于窗體是包括能夠滑動其內容的view.如有這種視圖,窗體的大小就會被調整。在這種假定的情況下,非常小的滑動就能夠使用窗體的內容可見。

該屬性是主windowr默認設置。

”adjustResize“

Activity的窗體總是被調整其大小以便為軟鍵盤騰出空間。

”adjustPan“

Activity的主窗體不會被調整其大小以便為軟鍵盤騰出空間。相反,窗體的內容會被自己主動移動以便當前的焦點不會被軟鍵盤遮住,用戶能夠總是看到他輸入的內容。

這個值一般用于用戶非常少想調整窗體的大小的情況下。由于用戶可能須要關閉軟鍵盤來與窗體的其他部分進行交互。

從上面系統的描寫敘述了解了系統在處理兩個交互時都顯示Activity和軟鍵盤都是看作window窗體來處理的。

非常多的時候,我們都希望可以監聽到軟件鍵盤的顯示與關閉狀態。比方下圖的情況,

你有一個登錄界面是這樣設計的

83ffddc409baf6a84eab3ceb86059190.png

你希望登錄時它是這種,

4d7cd11c63b6da63cd7f7d098ea1a9e9.png

然后你去嘗試給activity的windowSoftInputMode屬性加上值,當你加上?adjustResize時。它是這種

8d04de0fb63501e415cadef737883d7e.png

你不甘心。你將adjustResize改動成adjustPan,結果是這種

06ecc82d7ec6a360bd0e7bd2a74afc6c.png

沒有辦法。僅僅有靠我們自己來監聽鍵盤的顯示或隱藏來動態改變布局。如今的問題是怎么監聽到鍵盤的動態改變呢。系統并沒有提供對應的方法。我們能夠通過兩種方法來實現。

1.在adjustResize屬性下。activity的窗體大小會發生改變,而窗體中的layout的大小也必定后會發生改變。

當view大小發生改變時,必定會引起onSizeChanged(int, int, int, int)的回調。所以可能自己定義一個Layout。來監測onSizeChanged()函數的回調。然后在當中的作對應的處理。

這種方法也是網上傳的最多的方法。

2.借助ViewTreeOberserver類。ViewTreeOberserver能夠用來注冊一個監聽器。它能監聽view樹的全局變化。

這些變化包含但不限于,整個View的布局,繪制傳遞的源頭,觸摸模式的變化。

第一種方法的實現:

自己定義一個Layout。以RelativeLayout為例,

能夠在onSizeChanged(intw,inth,intoldw,intoldh)方法里監聽界面大小的變化,然后在該方法里定義回調函數。當監聽到鍵盤被調出時,將鍵盤向上推一段距離,這樣將登錄鍵顯示出來。

package com.example.keyboardlistener;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.widget.RelativeLayout;

public class KeyboardLayout extends RelativeLayout {

private onSizeChangedListener mChangedListener;

private static final String TAG ="KeyboardLayoutTAG";

private boolean mShowKeyboard = false;

public KeyboardLayout(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

// TODO Auto-generated constructor stub

}

public KeyboardLayout(Context context, AttributeSet attrs) {

super(context, attrs);

// TODO Auto-generated constructor stub

}

public KeyboardLayout(Context context) {

super(context);

// TODO Auto-generated constructor stub

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

// TODO Auto-generated method stub

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

Log.d(TAG, "onMeasure-----------");

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

// TODO Auto-generated method stub

super.onLayout(changed, l, t, r, b);

Log.d(TAG, "onLayout-------------------");

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

// TODO Auto-generated method stub

super.onSizeChanged(w, h, oldw, oldh);

Log.d(TAG, "--------------------------------------------------------------");

Log.d(TAG, "w----" + w + "\n" + "h-----" + h + "\n" + "oldW-----" + oldw + "\noldh----" + oldh);

if (null != mChangedListener && 0 != oldw && 0 != oldh) {

if (h < oldh) {

mShowKeyboard = true;

} else {

mShowKeyboard = false;

}

mChangedListener.onChanged(mShowKeyboard);

Log.d(TAG, "mShowKeyboard----- " + mShowKeyboard);

}

}

public void setOnSizeChangedListener(onSizeChangedListener listener) {

mChangedListener = listener;

}

interface onSizeChangedListener{

void onChanged(boolean showKeyboard);

}

}

在主Activity里創建一個Handler。當監聽到布局發生變化時,通過Handler更新UI。

package com.example.keyboardlistener;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.view.ViewTreeObserver.OnPreDrawListener;

import android.widget.Button;

import com.example.keyboardlistener.KeyboardLayout.onSizeChangedListener;

public class MainActivity extends Activity {

private static final String TAG = "KeyboardLayoutTAG";

private KeyboardLayout mRoot;

private Button mLogin;

private int mLoginBottom;

private static final int KEYBOARD_SHOW = 0X10;

private static final int KEYBOARD_HIDE = 0X20;

private boolean mGetBottom = true;

private Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

// TODO Auto-generated method stub

super.handleMessage(msg);

switch (msg.what) {

case KEYBOARD_HIDE:

mRoot.setPadding(0, 0, 0, 0);

break;

case KEYBOARD_SHOW:

int mRootBottom = mRoot.getBottom();

Log.d(TAG, "the mLoginBottom is " + mLoginBottom);

mRoot.setPadding(0, mRootBottom - mLoginBottom, 0, 0);

break;

default:

break;

}

}

};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

getActionBar().hide();

mRoot = (KeyboardLayout) findViewById(R.id.root_view);

mLogin = (Button) findViewById(R.id.login);

mRoot.setOnSizeChangedListener(new onSizeChangedListener() {

@Override

public void onChanged(boolean showKeyboard) {

// TODO Auto-generated method stub

if (showKeyboard) {

mHandler.sendMessage(mHandler.obtainMessage(KEYBOARD_SHOW));

Log.d(TAG, "show keyboard");

} else {

mHandler.sendMessage(mHandler.obtainMessage(KEYBOARD_HIDE));

}

}

});

mRoot.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {

@Override

public boolean onPreDraw() {

// TODO Auto-generated method stub

if (mGetBottom) {

mLoginBottom = mLogin.getBottom();//獲取登錄button的位置信息。

}

mGetBottom = false;

return true;

}

});

}

// @Override

// public boolean onCreateOptionsMenu(Menu menu) {

// // Inflate the menu; this adds items to the action bar if it is present.

// getMenuInflater().inflate(R.menu.main, menu);

// return true;

// }

}

另外一種方法的實現:

借助ViewTreeObserver類對你想監聽的view加入OnGlobalLayoutListener監聽器。然后在onGlobalLayout()方法里窗體的變化情況來推斷鍵盤是否被調出來了。以下是ViewTreeObserver監聽的部分的代碼:

mRoot.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

int offset = mRoot.getRootView().getHeight() - mRoot.getHeight();

//依據視圖的偏移值來推斷鍵盤是否顯示

if (offset > 300) {

mHandler.sendMessage(mHandler.obtainMessage(KEYBOARD_SHOW));

} else {

mHandler.sendMessage(mHandler.obtainMessage(KEYBOARD_HIDE));

}

}

});

當中Handler的詳細實現同上述結構中的Handler一樣。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397846.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397846.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397846.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

天才基本法_《天才基本法》強推!年度神仙小說,看完這本書我竟然愛上了數學...

《天才基本法》——長洱小說文案元寶的書評這個真的是本年度的神仙小說&#xff0c;講述了女主回到少女時代&#xff0c;可以和他一直暗戀的數學天才重來一遍。女主讓男主改變了覺得她碌碌無為的看法&#xff0c;也改變了自己的人生。本書最大的主角其實是數學&#xff01;天知…

dataTables插件使用

引用文件 <!-- DataTables CSS --> <link rel"stylesheet" type"text/css" href"http://cdn.datatables.net/1.10.7/css/jquery.dataTables.css"><!-- jQuery --> <script type"text/javascript" charset"u…

一行代碼,發送郵件

朋友讓我給他媳婦兒肚子里的孩子想個名字 走的越來越快了&#xff0c;有天看到一個論點關于說地域會影響人的一輩子。其實想想的確有這個理兒&#xff0c;這使我想起來每天早上擠地鐵的時候&#xff0c;其中有一個A站的人總是特別彪悍的往里擠&#xff0c;但B站的人就是永遠不會…

js call,apply,bind三個方法的區別

相同點&#xff1a; 都是能夠改變this的指向 不同點&#xff1a; 1.call()&#xff1a;傳參方式跟bind一樣&#xff08;都是以逗號隔開的傳參方式&#xff09;&#xff0c;但是跟apply&#xff08;以數組的形式傳參&#xff09;不一樣&#xff0c; 2.bind(): 此方法應用后的情形…

千年鴻蒙 盼爾來兮是什么意思,鴻蒙是什么意思_鴻蒙的意思和出處_我愛歷史網...

鴻蒙&#xff0c;是一個漢語詞語&#xff0c;亦作“鴻濛”。中國神話傳說的遠古時代&#xff0c;傳說在盤古開天辟地之前&#xff0c;世界是一團混沌狀&#xff0c;因此把那個時代稱作鴻蒙時代&#xff0c;后來該詞也常被用來泛指遠古時代。引證解釋亦作“鴻濛”。1、宇宙形成前…

python中調用萬年歷_python 打印萬年歷

題目&#xff1a;打印萬年歷已知條件閏年條件&#xff1a;能被4整除且不能被100整除&#xff0c;或者能被400整除1900年1月1日 是周一解題思路判斷閏年;判斷當月有多少天;這個月的1號是從周幾開始的;格式化打印日歷。解題代碼#判斷年份是否為閏年def is_leap_year(year):if (ye…

求水仙花數

求出所有的"水仙花數"&#xff0c;所謂"水仙花數"是指一個三位數&#xff0c;其各位數字立方和等于該數本身。 1 /**2 * 題目&#xff1a;打印出所有的"水仙花數"&#xff0c;所謂"水仙花數"是指一個三位數&#xff0c;其各位數字立方…

在VS2015中用C++創建DLL并用C#調用且同時實現對DLL的調試

from:http://m.blog.csdn.net/article/details?id51075023 在VS2015中先創建C#項目&#xff0c;然后再創建要編寫的動態庫DLL項目&#xff0c;這樣做的好處是整個解決方案的編程環境是C#模式&#xff0c;這樣就可以有很多智能的提示或快捷的編程方式在整個解決方案中都可以使用…

(轉)CocosCreator零基礎制作游戲《極限跳躍》二、制作游戲開始場景

CocosCreator零基礎制作游戲《極限跳躍》二、制作游戲開始場景 我們剛剛分析了《極限跳躍》這款游戲&#xff0c;下面我們開始制作第一個游戲場景&#xff0c;也就是游戲的開始場景。 首先&#xff0c;打開CocosCreator&#xff0c;新建HelloWorld項目。選擇項目路徑&#xff0…

連接池超時配置_HttpClient連接池的一些思考

前言使用apache的httpclient進行http的交互處理已經很長時間了&#xff0c;而httpclient實例則使用了http連接池&#xff0c;想必大家也沒有關心過連接池的管理。事實上&#xff0c;通過分析httpclient源碼&#xff0c;發現它很優雅地隱藏了所有的連接池管理細節&#xff0c;開…

android界面布局錯位,IOS 瀏覽器頁面布局錯位(如:點不到)的分析與解決

IOS 瀏覽器頁面布局錯位(如&#xff1a;點不到)的分析與解決IOS 瀏覽器軟鍵盤的拉起與收縮、微信 IOS 瀏覽器底部導航條的顯示與隱藏&#xff0c;很容易導致頁面布局錯位(相對窗體的絕對定位元素)&#xff1a;明明按鈕在這里&#xff0c;卻要在上面一點兒點擊屏幕才能點到它明明…

做進度條 根據自己的數據顯示進度

做了很多種方法 1&#xff1a; 線程 thread的方法 2&#xff1a; backGroundWorker的方法 3&#xff1a; 自定義線程類 4&#xff1a; 做一個進度條的窗體 通過自定義設置做&#xff08;最方便快捷&#xff09; public partial class waitingProcessbar : Form{public waitin…

視圖和模型變換

視圖變換&#xff0c;是指變換照相機的位置&#xff0c;角度。 模型變換&#xff0c;是指變換被照物體的位置&#xff0c;角度。 這兩個變換&#xff0c;都會影響最終圖形中&#xff0c;物體的位置&#xff0c;角度。而這兩個變換&#xff0c;可以達到相同的效果。比如&#x…

phoenix的元數據一般存在哪里_Phoenix的一些問題

date: 2020-09-10 13:50:00updated: 2020-09-14 16:30:001. Phoenix索引全局索引&#xff1a;適合讀多寫少的場景。寫數據時因為索引表分布在不同數據節點&#xff0c;跨節點數據傳輸帶來巨大的性能消耗。全局索引必須是查詢語句中所有列都包含在全局索引中&#xff0c;它才會生…

鴻蒙os全面升級,華為突然宣布,鴻蒙OS正式版6月底全面升級,幸福來得太突然...

原標題&#xff1a;華為突然宣布&#xff0c;鴻蒙OS正式版6月底全面升級&#xff0c;幸福來得太突然摘要&#xff1a;早在今年2月華為Mate X2折疊屏新品發布會上&#xff0c;余承東曾表示&#xff0c;鴻蒙OS正式版將于今年4月份全面上線。或許是因為華為宣布賣車分散了很多的精…

5-python學習——條件語句

5-python學習——條件語句 5-python學習——條件語句 條件語句if else形式if else條件語句說明 測試一下編程語言一般都由這么幾個部分組成 變量條件分支語句循環語句函數這里要說的就是條件分支語句。 python的條件語句和shell腳本的非常像&#xff0c;也就是if else if else這…

eclipse啟動失敗:An internal error occurred during: reload maven project

2019獨角獸企業重金招聘Python工程師標準>>> 1.找到workspace文件夾下的/.metadata文件夾&#xff0c;將其刪除掉&#xff0c;然后在講項目重新導入進去eclipse中。但是這個有一點不好的地方&#xff0c;之前對eclipse所做的配置也會恢復為默認配置 2.在.metadata下…

Quartz2D知識點聚合案例

Quartz2D知識點聚合 基本 //畫圖片UIImage *image [UIImage imageNamed:"阿貍頭像"];[image drawInRect:rect];//字體NSString *title "標題";NSMutableDictionary *atr [NSMutableDictionary dictionary];atr[NSFontAttributeName] [UIFont systemFon…

skt7850鴻蒙策略,lol 英雄聯盟 SKT狀態回暖輕取外卡,SUP難擋Faker

MSI 第四日 SUP vs SKT雙方bpBAN LISTBAN&#xff1a;SUP:流浪 牛頭 豹女SKT&#xff1a;巴德 妖姬 魚人PICKSUP:大樹 男槍 冰女 盧錫安 錘石SKT&#xff1a;艾克 千玨 沙皇 EZ 布隆比賽開始&#xff0c;雙方正常對線開局。前期下路錘石多次勾中ez&#xff0c;男槍也來逼出EZ布…

spring集成struts2

Struts2前身是WebWork&#xff0c;核心并沒有改變&#xff0c;其實就是把WebWork改名為struts2&#xff0c;與Struts1一點關系沒有。 Struts2中通過ObjectFactory接口實現創建及獲取Action實例&#xff0c;類似于Spring的IoC容器&#xff0c;所以Action實例可以由ObjectFactory…