2

我使用ViewPager,並在ViewPager的第一個片段內我有另一個片段,其父母的子片段與ScrollView在其中。使其更直觀:在scrollview中滾動ViewPager中的一個片段與軟鍵盤可見

┌------------┐ 
| 1  | 1 is the ViewPager fragment 
| ┌---------┐| 
| | 2  || 2 is the fragment inside ViewPager fragment 
| |┌-------┐|| 
| ||3  ||| 3 is the sub fragment containing the ScrollView with EditText form 
| ||form ||| 
| ||here ||| 
| ||  ||| 
| |└-------┘|| 
| └---------┘| 
└------------┘ 

問題:鑑於調整,但滾動視圖不能滾動,直到視圖的結束和一些內容仍然是鍵盤的背面。當我從表單底部選擇編輯文本時,此行爲會發生變化。在這種情況下,片段1(viewpager)和片段2(子片段)向上移動並允許滾動視圖顯示最後一個元素。

而尋找這種行爲我看到SO很多職位,如:

Scrollview inside a viewpager fragment doesn't scroll when keyboard is shown

和ofcourse的original bug report對已被標記爲故意行爲全屏活動。請注意,我的情況下我沒有使用全屏活動。但是在ViewPager中有關於ScrollView的類似行爲的報告。

我嘗試使用變通方法:

public class AndroidBug5497Workaround { 

// 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) { 
    new AndroidBug5497Workaround(activity); 
} 

private View mChildOfContent; 
private int usableHeightPrevious; 
private FrameLayout.LayoutParams frameLayoutParams; 

private AndroidBug5497Workaround(Activity activity) { 
    FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); 
    mChildOfContent = content.getChildAt(0); 
    mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      possiblyResizeChildOfContent(); 
     } 
    }); 
    frameLayoutParams = (FrameLayout.LayoutParams) mChildOfContent.getLayoutParams(); 
} 

private void possiblyResizeChildOfContent() { 
    int usableHeightNow = computeUsableHeight(); 
    if (usableHeightNow != usableHeightPrevious) { 
     int usableHeightSansKeyboard = mChildOfContent.getRootView().getHeight(); 
     int heightDifference = usableHeightSansKeyboard - usableHeightNow; 
     if (heightDifference > (usableHeightSansKeyboard/4)) { 
      // keyboard probably just became visible 
      frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; 
     } else { 
      // keyboard probably just became hidden 
      frameLayoutParams.height = usableHeightSansKeyboard; 
     } 
     mChildOfContent.requestLayout(); 
     usableHeightPrevious = usableHeightNow; 
    } 
} 

private int computeUsableHeight() { 
    Rect r = new Rect(); 
    mChildOfContent.getWindowVisibleDisplayFrame(r); 
    return (r.bottom - r.top); 
} 

} 

的問題是,當我用它工作的解決辦法,但它也將創造當我點擊下部EditTexts增加一個額外的空白scrollview內部的窗體。 我懷疑它與adjust_resize有關,或者錯算了解決方法中的高度。

這裏是解決方法的結果。

當我選擇從窗體頂部的EditText(一些額外的空格)

enter image description here

當我從表格(很多額外的空格)

結束選擇 EditText

enter image description here

您的幫助表示感謝!

回答

0

您是否嘗試過android:fillViewport="true"ScrollView如果不是,請嘗試此操作。

並在其中包含您manifiest的活動使用您的ViewPager

android:windowSoftInputMode="adjustResize" 

希望它會幫助你。

+0

我嘗試過使用'adjustResize'和'adjustPan'。當我使用'adjustResize'時,它會很好的滾動ScrollView。但在小屏幕中,「子片段3」隱藏在「軟鍵盤」後面。 當我在小屏幕上使用'adjustPan'時,它會將父片段1和2向上推並顯示片段3.但是'ScrollView'不會滾動到結尾,並且某些內容隱藏在鍵盤後面。 [這裏我也發佈了一個關於該主題的更多細節的問題](https:// stackoverflow。com/questions/45330600/adjustpan-and-adjust在嵌套代碼片段中) 感謝您幫助 – Poorya

+0

進一步解釋我上傳了一個包含相關代碼的小型項目以促進此過程。如果你看看[Github Repo Link](https://github.com/pouriabagheri/ScrollViewAdjustViewPager),我將不勝感激。 – Poorya