簡體   English   中英

當顯示鍵盤時,viewpager片段內的Scrollview不會滾動

[英]Scrollview inside a viewpager fragment doesnt scroll when keyboard is shown

我有一個活動,其布局內容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:background="?attr/colorPrimary"
     android:minHeight="?attr/actionBarSize"
     style="@style/ToolBarStyle.Event" />

    <com.mypackage.corecode.ui.view.SlidingTabLayout
        android:id="@+id/sliding_tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/primary_color" />

    <android.support.v4.view.ViewPager
        android:id="@+id/vendor_main_tabview_pager"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

</LinearLayout>

在viewpager中,我有一個片段,它具有以下布局:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

                    <LinearLayout
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:weightSum="3"
                        android:orientation="horizontal">

                        <EditText
                            android:theme="@style/ScrollableContentThemeNoActionBar"
                            android:id="@+id/edit_text_vendor_sms_phone_number"
                            android:layout_width="0dp"
                            android:layout_weight="2"
                            android:layout_height="wrap_content"
                            android:inputType="number" />

                        <Button
                            android:id="@+id/button_send_sms"
                            android:layout_width="0dp"
                            android:layout_weight="1"
                            android:layout_height="wrap_content"
                            />
                    </LinearLayout>
         </LinearLayout>
 </ScrollView>

當片段內的內容不適合屏幕時,滾動視圖允許用戶查看屏幕下方的內容。 (按預期工作)

問題是當edittext獲得焦點時,鍵盤與edittext區域重疊,而不是滾動視圖導致內容滾動。

我希望片段能夠處理鍵盤和scrollview以適應屏幕上的鍵盤。

或者我錯了,是否對鍵盤負責? 由於活動布局中的根視圖是linearlayout,它是否限制了擴展?

我嘗試用滾動視圖包裝活動布局的整個內容,但是如果我沒有給它一個固定的大小,這次viewpager不會出現在屏幕上。 即使我這樣做,我最終在片段內部有一個滾動視圖,它位於主布局的滾動視圖下方,而鍵盤仍然在編輯文本上方盤旋。

我在這里有點迷失,我的目標是能夠在編輯文本聚焦時滾動片段內容,而是鍵盤當前與edittext重疊。

我可能會搞錯,但可能是因為已知的Android錯誤,您只需要在項目中添加下一個類:

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);
    }

}

然后通過調用包含ViewPagerSlidingTabLayout Activity中的assistActivity()方法來簡單地使用它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(...);
    AndroidBug5497Workaround.assistActivity(this);
    ...
}

有關更多背景,請查看主題。

我在ScrollView中遇到類似的問題。 您需要添加一個類似OnTouchListenerScrollViewOnCrateView

myList.setOnTouchListener(new ListView.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
            // Disallow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

            case MotionEvent.ACTION_UP:
            // Allow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }

        // Handle ListView touch events.
        v.onTouchEvent(event);
        return true;
    }
});

這是另一個可能對你有幫助的答案

我認為你需要使用adjustPan或adjustResize在鍵盤顯示時自動調整空間。 根據文件:

“adjustResize”活動的主窗口始終調整大小,以便為屏幕上的軟鍵盤騰出空間。

“adjustPan”活動的主窗口未調整大小以便為軟鍵盤騰出空間。 相反,窗口的內容會自動平移,以便鍵盤不會遮擋當前焦點,用戶可以隨時看到他們正在鍵入的內容。 這通常比調整大小更不合適,因為用戶可能需要關閉軟鍵盤以獲得窗口的模糊部分並與其交互。

您可以在活動標記下的清單中聲明其中一個,如下所示:android:windowSoftInputMode =“stateUnchanged | adjustResize

我希望這能滿足你的要求。

你必須創建子類ViewPager的再覆蓋的onTouchEvent如圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM