廢話少說,上圖看效果
為什么是美騎呢供置,呃·········我不是美騎網(wǎng)的··········
因?yàn)槲易约旱淖鐾炅私飨妫瑳]有反面例子,剛好在桌面看到了這個(gè)芥丧,所以不好意思辣紧阔,這就是典型的反面例子,不過美騎也別傷心嘛续担,起碼我給你們打廣告了
當(dāng)我點(diǎn)擊手機(jī)那里輸入的時(shí)候擅耽,軟鍵盤彈出,擋住了登錄按鈕物遇,這是對(duì)用戶體驗(yàn)造成很不好的影響········
所以客戶發(fā)現(xiàn)了這個(gè)問題乖仇,要求我們的應(yīng)用要改,要有微信的效果
微信的效果是什么询兴,就是輸入的時(shí)候整個(gè)布局會(huì)上移乃沙,露出登錄的按鈕····
話說微信也只是最后一個(gè)才會(huì)彈上去,其他的不會(huì)
客戶輕飄飄的一句話說的簡(jiǎn)單诗舰,改起來··········
其實(shí)我一開始認(rèn)為也很簡(jiǎn)單的警儒,在manifest里面加個(gè)軟件盤的參數(shù)嘛
android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
然而發(fā)現(xiàn)沒卵用
百度一下,用ScrollView就好始衅,用了冷蚂,結(jié)果不會(huì)彈上去缭保,各種問題
把按鈕放ScrollView外面,會(huì)彈了蝙茶,但是不美觀艺骂,下面空出一大片······
好了那只能手動(dòng)彈吧
然后ScrollView有個(gè)方法叫 fullScroll 用法就是
mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
作用就是直接滑動(dòng)到底部·······
本來沒啥問題,問題就是一調(diào)用這個(gè)方法Editext的焦點(diǎn)啊隆夯,焦點(diǎn)也自動(dòng)滑動(dòng)到下面了钳恕,導(dǎo)致賬戶名那里根本選擇不了·······
為了調(diào)出這個(gè)bug也是千辛萬苦啊,說多了都是淚·········
后來只能用scrollTo了蹄衷,簡(jiǎn)單忧额,粗暴·····
算了,上面都是坑愧口,直接講實(shí)現(xiàn)吧:
//鍵盤不遮擋按鈕
private void setScroll() {
KeyboardUtil.assistActivity(this, R.id.scroll_view); //這個(gè)是別人給我的工具類睦番,只用這個(gè)會(huì)有
parent.setOnTouchListener(new View.OnTouchListener() { //parent為Editext外面那層布局
@Override
public boolean onTouch(View v, MotionEvent event) {
parent.setFocusable(true);
parent.setFocusableInTouchMode(true);
parent.requestFocus();
InputMethodManager imm = (InputMethodManager) LoginActivity.this
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(account.getWindowToken(), 0); //隱藏鍵盤,account為Editext耍属,隨便一個(gè)就好
return false;
}
});
scroll.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { //scroll為parent外面那層布局()最好用NestedScrollView托嚣,ScrollView會(huì)有版本問題
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
v.scrollTo(0,450); //這個(gè)是滑動(dòng)距離,隨便大一點(diǎn)就好
}
});
}
繼續(xù)上工具類:
public class KeyboardUtil {
private static final String TAG = "KeyboardUtil";
// For more information, see
// https://code.google.com/p/android/issues/detail?id=5497
// To use this class, simply invoke assistActivity() on an Activity that
// already has its content view set.
public static void assistActivity(Activity activity, int viewId) {
new KeyboardUtil(activity, viewId);
}
private View mChildOfContent;
private NestedScrollView mScrollView;
private RelativeLayout.LayoutParams relativeLayoutParams;
private KeyboardUtil(Activity activity, int viewId) {
FrameLayout content = (FrameLayout) activity
.findViewById(android.R.id.content);
mChildOfContent = content.getChildAt(0);
mScrollView = (NestedScrollView) content.findViewById(viewId);
mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
possiblyResizeChildOfContent();
}
});
}
private void possiblyResizeChildOfContent() {
int contentHeight = mChildOfContent.getRootView().getHeight();
int curDisplayHeight = computeUsableHeight();
if (contentHeight - curDisplayHeight > contentHeight / 4) {
Log.e(TAG, "possiblyResizeChildOfContent: 1" );
mScrollView.scrollTo(0,600);
// mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
} else {
Log.e(TAG, "possiblyResizeChildOfContent: 2" );
}
}
/**
* 獲取屏幕可顯示區(qū)域高度
*
* @return
*/
private int computeUsableHeight() {
Rect r = new Rect();
mChildOfContent.getWindowVisibleDisplayFrame(r);
return r.height();
}
}
想了想還是把布局寫出來吧
<LinearLayout
··········
<android.support.v4.widget.NestedScrollView
android:id="@+id/scroll_view"
<LinearLayout
android:id="@+id/ll_parent"
<EditText/>
<EditText/>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
</LinearLayout>
大概就是這樣的
好歹也坑了我那么久厚骗,必須寫出來示启,你們別踩就好~
或者有更好的辦法,告訴我一下唄领舰,我寫完都覺得這種方法好粗暴啊夫嗓,哈哈哈~
·