?在很多Android App 開(kāi)發(fā)的過(guò)程中,需要對(duì)Activity 中 軟鍵盤(pán)的彈起和關(guān)閉進(jìn)項(xiàng)監(jiān)聽(tīng),但是Andoid中并沒(méi)有提供相對(duì)應(yīng)的api進(jìn)行監(jiān)聽(tīng), 我有一個(gè)簡(jiǎn)單的方法。

在晉中等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都營(yíng)銷網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,晉中網(wǎng)站建設(shè)費(fèi)用合理。
首先需要知道一些基礎(chǔ)知識(shí)
在manifest文件中可以設(shè)置Activity的android:windowSoftInputMode屬性,這個(gè)屬性值常見(jiàn)的設(shè)置如下:android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
那么這里值的含義列表如下:
1、stateUnspecified:軟鍵盤(pán)的狀態(tài)并沒(méi)有指定,系統(tǒng)將選擇一個(gè)合適的狀態(tài)或依賴于主題的設(shè)置
2、stateUnchanged:當(dāng)這個(gè)activity出現(xiàn)時(shí),軟鍵盤(pán)將一直保持在上一個(gè)activity里的狀態(tài),無(wú)論是隱藏還是顯示
3、stateHidden:用戶選擇activity時(shí),軟鍵盤(pán)總是被隱藏
4、stateAlwaysHidden:當(dāng)該Activity主窗口獲取焦點(diǎn)時(shí),軟鍵盤(pán)也總是被隱藏的
5、stateVisible:軟鍵盤(pán)通常是可見(jiàn)的
6、stateAlwaysVisible:用戶選擇activity時(shí),軟鍵盤(pán)總是顯示的狀態(tài)
7、adjustUnspecified:默認(rèn)設(shè)置,通常由系統(tǒng)自行決定是隱藏還是顯示
8、adjustResize:該Activity總是調(diào)整屏幕的大小以便留出軟鍵盤(pán)的空間
9、adjustPan:當(dāng)前窗口的內(nèi)容將自動(dòng)移動(dòng)以便當(dāng)前焦點(diǎn)從不被鍵盤(pán)覆蓋和用戶能總是看到輸入內(nèi)容的部分
案例:
1.我們需要將監(jiān)聽(tīng)所在的Activity在Manifest文件中的設(shè)置為如下形式:
activity?
android:name="com.zy.project.MainActivity"
android:label="@string/app_name"
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
intent-filter
? ? ?action android:name="android.intent.action.MAIN/
? ? category android:name="android.intent.category.LAUNCHER/
/intent-filter
/activity
當(dāng)有軟鍵盤(pán)彈起時(shí),Activity的布局大小會(huì)被滾動(dòng)上去,但是你仍然可以通過(guò)滑動(dòng)瀏覽所有。
2 需要在外層布局文件設(shè)置一個(gè)id,并在activity 中設(shè)置監(jiān)聽(tīng)
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnLayoutChangeListener;
import android.widget.Toast;
public class MainActivity extends Activity implements OnLayoutChangeListener{
//Activity最外層的Layout視圖
private View rootView;
//屏幕高度
private int screenHeight = 0;
//軟件盤(pán)彈起后所占高度閥值 一般是占用屏幕的1/3
private int keyHeight = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootView = findViewById(R.id.root_layout);
//獲取屏幕高度
screenHeight = this.getWindowManager().getDefaultDisplay().getHeight();
//閥值設(shè)置為屏幕高度的1/3
keyHeight = screenHeight/3;
}
@Override
protected void onResume() {
super.onResume();
//添加layout大小發(fā)生改變監(jiān)聽(tīng)器
rootView.addOnLayoutChangeListener(this);
}
@Override
public void onLayoutChange(View v, int left, int top, int right,int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
//old是改變前的左上右下坐標(biāo)點(diǎn)值,沒(méi)有old的是改變后的左上右下坐標(biāo)點(diǎn)值
// System.out.println(oldLeft + " " + oldTop +" " + oldRight + " " + oldBottom);
// System.out.println(left + " " + top +" " + right + " " + bottom);
//現(xiàn)在認(rèn)為只要控件將Activity向上推的高度超過(guò)了1/3屏幕高,就認(rèn)為軟鍵盤(pán)彈起
if(oldBottom != 0 bottom != 0 (oldBottom - bottom keyHeight)){
Toast.makeText(MainActivity.this, "監(jiān)聽(tīng)到軟鍵盤(pán)彈起...", Toast.LENGTH_SHORT).show();
}else if(oldBottom != 0 bottom != 0 (bottom - oldBottom keyHeight)){
Toast.makeText(MainActivity.this, "監(jiān)聽(tīng)到軟件盤(pán)關(guān)閉...", Toast.LENGTH_SHORT).show();
}
}
本文來(lái)自:
1、一般來(lái)說(shuō)直接傳parent_resid就可以了。但是!!!
2、scrollview不能onclick監(jiān)聽(tīng),但是要監(jiān)聽(tīng)他的點(diǎn)擊和滑動(dòng)就得用ontouch監(jiān)聽(tīng)
3、如果parent下有個(gè)差不多占據(jù)整個(gè)屏幕的scrollview請(qǐng)傳scrollview_resid比較好,因?yàn)閜arent_resid被遮擋了,監(jiān)聽(tīng)不到。。。
android鍵盤(pán)收回的話,可以調(diào)用系統(tǒng)的方法:
隱藏軟鍵盤(pán):
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 隱藏軟鍵盤(pán)
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);
Fragment中與顯示同理。
我們目前的項(xiàng)目是采用單 Activity 多 Fragment 的架構(gòu)模式, AndroidManifest.xml 內(nèi) MainActivity 的配置如下所示。
stateHidden
狀態(tài)隱藏,如果我們?cè)O(shè)置了這個(gè)屬性,鍵盤(pán)狀態(tài)就一定是隱藏的,不管上個(gè)界面是什么狀態(tài),也不管當(dāng)前界面有沒(méi)有輸入的需求,就是不顯示軟鍵盤(pán)。
adjustResize
調(diào)整大小狀態(tài),這個(gè)屬性表示 Activity 的主窗口總是會(huì)被調(diào)整大小來(lái)保證軟鍵盤(pán)的顯示空間。如果界面中有可滑動(dòng)控件,顯示效果跟 adjustUnspecified 顯示效果一樣;如果界面中沒(méi)有可滑動(dòng)控件,軟鍵盤(pán)可能會(huì)蓋住一些控件(布局的位置不會(huì)發(fā)生變化,可能獲取了焦點(diǎn)的控件被軟鍵盤(pán)蓋住)。
一般來(lái)說(shuō),我們的布局分為兩種
第一種布局是不會(huì)出現(xiàn)軟鍵盤(pán)把底部按鈕頂起的情況,首先軟鍵盤(pán)的打開(kāi)實(shí)際上是一個(gè) Dialog,而我們?cè)谂渲梦募?nèi)的 adjustResize 屬性是在頁(yè)面的根布局 decorView 的子 view 也就是一個(gè)線性布局內(nèi)通過(guò)設(shè)置 paddingBottom = 軟鍵盤(pán)高度,這樣其實(shí)相當(dāng)于把整個(gè)滾動(dòng)布局的高度減少了,所以底部的按鈕也只是變?yōu)樾枰獫L動(dòng)才能看到。
第二種情況通常為一個(gè)繼續(xù)按鈕始終處于頁(yè)面的底部,中間的內(nèi)容可以滾動(dòng),當(dāng)根布局的內(nèi)邊距等于軟鍵盤(pán)高度時(shí),底部按鈕就看起來(lái)像是被頂起。
1、監(jiān)聽(tīng)軟鍵盤(pán)的打開(kāi)收起
2、修改 windowSoftInputMode
adjustPan
如果設(shè)置了這個(gè)屬性,當(dāng)軟鍵盤(pán)彈出的時(shí)候,系統(tǒng)會(huì)通過(guò)布局的移動(dòng),來(lái)保證用戶要進(jìn)行輸入的輸入框在用戶的視線范圍內(nèi)。如果界面沒(méi)有可滑動(dòng)控件,顯示效果和 adjustUnspecified 效果一樣;如果界面有可滑動(dòng)控件,在軟鍵盤(pán)顯示的時(shí)候,可能會(huì)有一些內(nèi)容顯示不出來(lái)。
資料借鑒
Android中Activity的android:windowSoftInputMode屬性
網(wǎng)站標(biāo)題:android收起軟鍵盤(pán),安卓用鍵盤(pán)
標(biāo)題URL:http://chinadenli.net/article17/dsgdjdj.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、面包屑導(dǎo)航、品牌網(wǎng)站制作、企業(yè)網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)