開局就是二張圖。先看效果是不是自己想要的,然後再慢慢往下看。第一張圖是預設高度,第二張圖是高度增加之後的變化。可以看到,切換還是蠻順暢的,沒有出現跳閃的情況。
當屬性為adjustresize的時候,軟鍵盤彈出時會擠壓activity視窗大小,這樣可以保證輸入法不會覆蓋到輸入框;
當屬性為adjustnothing的時候,軟鍵盤彈出時會覆蓋到當前視窗上,視窗大小不變,這種情況輸入法有可能會覆蓋輸入框。
知道解決的關鍵點之後,還需知道軟鍵盤的高度,以及軟鍵盤的隱藏和顯示狀態。這樣就可以對不同的情況進行相應的改變。
先上**獲取軟鍵盤的高度和顯示、隱藏狀態的**。
這個類是乙個自定義布局類,只是用來監聽軟鍵盤的狀態,使用時直接放到對應activity的布局下即可。不需用給寬高屬性。public class keyboardlayout extends framelayout
public keyboardlayout(context context, attributeset attrs)
public keyboardlayout(context context, attributeset attrs, int defstyleattr)
private class keyboardonglobalchangelistener implements viewtreeobserver.ongloballayoutlistener
mscreenheight = ((windowmanager) getcontext().getsystemservice(context.window_service))
.getdefaultdisplay().getheight();
return mscreenheight;
}@override
public void ongloballayout()
miskeyboardactive = isactive;
if (mlistener != null) }}
public void setkeyboardlistener(keyboardlayoutlistener listener)
public keyboardlayoutlistener getkeyboardlistener()
public boolean iskeyboardactive()
/*** 獲取輸入法高度
** @return
*/public int getkeyboardheight()
public inte***ce keyboardlayoutlistener
}
主體的邏輯**。
布局**我就不貼了,主要就是activity**。上面我都寫了相應的注釋。這裡面我還增加了底部面板的顯示和隱藏動畫(屬性動畫),這樣不會太生硬。當軟鍵盤隱藏時,顯示面板和隱藏面板都會以動畫形式展現。當軟鍵盤顯示時,則直接顯示和隱藏面板。public class conversationactivity extends baseactivity
private void initdata()
private void initview()
}});
keyboardlayout.setkeyboardlistener(new keyboardlayout.keyboardlayoutlistener()
} else
}});
//觸控空白處進行軟鍵盤和面板的隱藏
rlcontent.setontouchlistener(new view.ontouchlistener()
}return false;
}});
}// 每當輸入框高度發生變化時,去改變面板的高度
private void updatepanelheight()
private runnable mhideemotionpaneltask = new runnable()
};@onclick()
public void onclick(view view)
} else else
}break;
case r.id.conversation_iv_switch:
hidepanelorinput();
break;
default:
break;}}
/*** 顯示底部面板 (如果鍵盤已經出現,此時展示面板不需用動畫,直接展示即可,如果鍵盤未顯示,則增加乙個向上的動畫)
** @param isanimal 是否以動畫形式展現
* @param duration 動畫時長(預設為300ms)
*/private void showpanel(boolean isanimal, long duration)
@override
public void onanimationend(animator animation)
});animator.start();
} else
}/**
* 隱藏底部面板 (如果鍵盤已經出現,此時隱藏面板不需用動畫,直接隱藏即可,如果鍵盤未顯示,則增加乙個向下的動畫)
** @param isanimal 是否以動畫形式展現
* @param duration 動畫時長(預設為300ms)
*/private void hidepanel(boolean isanimal, long duration)
});animator.start();
} else }}
//更改輸入法軟鍵盤彈出方式
public static void updatesoftinputmethod(activity activity, int softinputmode) }}
//隱藏軟鍵盤
protected void hideinput()
//顯示軟鍵盤
protected void showinput()
//屬性動畫是可以直接改變view的寬高的 通過不斷改變view的屬性來產生動畫的效果
public void setanimaupdatelistener(valueanimator valueanimator, final view view)
});}
//隱藏輸入框或底部面板
public void hidepanelorinput()
//如果面板顯示,則進行下降動畫的隱藏
if (llbottompanel.getvisibility() == view.visible)
}@override
public void onbackpressed()
super.onbackpressed();}}
還有乙個特別需要注意的地方。需要在清單檔案中對activity設定乙個預設的windowsoftinputmode,不然跳閃的情況就還會出現。
嗯,差不多到這就結束了。有不懂的地方可以加我 qq1902366297
android遮蔽軟鍵盤
android name mainactivity android screenorientation landscape android windowsoftinputmode adjustpan statehidden android configchanges orientation keyb...
Android 軟鍵盤互動
方法很簡單,在edittext中設定兩個屬性 android imeoptions actionsearch android singleline true 這兩個屬性必須一起設定,不然不會生效。在沒有設定imeoptions屬性的情況下,設定了inputtype或者singleline true ...
Android軟鍵盤研究
android軟鍵盤研究 1.利用按鈕彈出軟鍵盤。2.程式啟動後直接彈出軟鍵盤。1.由button的onclick事件調出軟鍵盤和隱藏軟鍵盤。具體 如下 public class test extends activity implements onclicklistener l.addview b...