序言
設置EditText位於ScrollView下方,當ScrollView的高度大於屏幕高度,EditText就會被擠出屏幕,而若是把EditText固定在屏幕底部,當ScrollView的高度小於屏幕高度,ScrollView和EditText之間就會出現一段空白,那麼如何實現EditText隨ScrollView高度變化,到達屏幕底部固定?android
分析
要實現EditText隨ScrollView高度變化,佈局通常是這樣的:ide
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" <ScrollView android:id="@+id/dvp_scroll_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#D6DADD" android:overScrollMode="never" android:padding="2dp" android:scrollbars="none" /> <EditText android:id="@+id/edittext1" android:layout_width="match_parent" android:layout_height="wrap_content" ***android:layout_below="@id/dvp_scroll_view"*** android:background="#EEEFF1" /> </RelativeLayout>
而要實現固定在屏幕底部,通常佈局是這樣的:佈局
<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" <ScrollView android:id="@+id/dvp_scroll_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#D6DADD" android:overScrollMode="never" android:padding="2dp" android:scrollbars="none" /> <EditText android:id="@+id/edittext2" android:layout_width="match_parent" android:layout_height="wrap_content" ***android:layout_alignParentBottom="true"*** android:background="#EEEFF1" /> </RelativeLayout>
怎麼才能把他們融合到一塊兒呢,據我目前掌握的知識和查閱的資料來看,要想經過設置某個屬性,或者計算scrollview和屏幕高度來實現,幾乎是一項沒法完成的任務,還但願看到我這篇文章的大神可以給小弟指點。既然沒法融合,只能另闢蹊徑,全部我想到了另外一種方法,下面我把實現方法簡單梳理一下post
實現方法線程
在佈局中放置兩個EditText,一個設置爲android:layout_below="@id/scrollview,稱爲「EditText1」另外一個設置爲android:layout_alignParentBottom="true",稱爲「EditText2」佈局很簡單,這裏就不貼代碼了
首先隱藏EditText2,計算ScrollView的高度或者EditText1的座標,若是大於屏幕高度,就隱藏EditText1,顯示EditText2,計算方法有不少種,這裏先貼一種我使用的方法,但無論用哪一種計算方法,都要注意調用view.post(new Runnable(){});把計算的代碼放到線程裏,否則計算的結果永遠是0;code
EditText1.post(new Runnable() { @Override public void run() { int[] position = new int[2]; EditText1.getLocationInWindow(position); WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE); if (position[1] + EditText1.getHeight() > wm .getDefaultDisplay().getHeight()) { EditText1.setVisibility(View.GONE); EditText2.setVisibility(View.VISIBLE); } } });
經過運行程序,確認這種方法是可行的,可是還有一個問題,當點擊EditText彈出軟鍵盤時,EditText2會自動上移,而EditText1被軟鍵盤擋住了,經過查閱網上的資料,整體來講,有四種解決方案xml
方法一
在你的activity中的oncreate中setContentView以前寫上這個代碼
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);接口
方法二
在 項目的AndroidManifest.xml文件中界面對應的<activity>里加入
<activity android:windowSoftInputMode="stateVisible|adjustResize" >
在這設置的值(除"stateUnspecified"和"adjustUnspecified"之外)將覆蓋在主題中設置的值生命週期
方法三
把頂級的layout替換成ScrollView,或者說在頂級的Layout上面再加一層ScrollView。這樣就會把軟鍵盤和輸入框一塊兒滾動了,軟鍵盤會一直處於底部。ci
<ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" <ScrollView android:id="@+id/dvp_scroll_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#D6DADD" android:overScrollMode="never" android:padding="2dp" android:scrollbars="none" /> <EditText android:id="@+id/edittext1" android:layout_width="match_parent" android:layout_height="wrap_content" ***android:layout_below="@id/dvp_scroll_view"*** android:background="#EEEFF1" /> </RelativeLayout> </ScrollView>
方法四
自定義LinearLayoutView
該組件可實現根據軟鍵盤的彈出/關閉而隱藏和顯示某些區域,這是問題解決最關鍵部分,主要有兩點:
① 重寫onSizeChanged方法
該方法是View生命週期的方法,當View尺寸發生變化時調用,如豎屏橫屏切換、軟鍵盤彈出。這裏當軟鍵盤彈出形成View尺寸改變,就會調用onSizeChanged方法,在該方法實現代碼的核心思想是根據尺寸變化,當變大(軟鍵盤彈出),將某些區域隱藏以給編輯界面預留出足夠顯示空間;當恢復(軟鍵盤關閉),再將隱藏的區域顯示出來
②提供KeyBordStateListener 接口採用回調機制調用接口的實現方法。
經過驗證,方法一和二都是把整個屏幕上移,不是我想要的效果,方法三簡單可行,解決了EditText被軟鍵盤遮擋的問題,到此問題基本獲得解決
總結整個過程當中容易被忽視的兩點:1.計算控件寬高度和座標的代碼須要放到線程中2.只有scrollview在軟鍵盤彈出時,會自動壓縮所佔空間,因此要想不被軟件盤擋住,就要把在最外層多套一層scrollview