如何實現EditText隨ScrollView高度變化,到達屏幕底部固定

序言
設置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

相關文章
相關標籤/搜索