4

Я разрабатываю одно приложение, которое содержит Activity и Fragment. В макете фрагментов я использовал Relative Layout как Parent Layout, одну кнопку внизу и между Scrollview. Scrollview содержит editText Boxes. Если я нажму Последнее editTextBox в scrollview Моя клавиатура скрывает fragment. Я попробовал adjustpan|adjustresize в манифесте, а также в моем fragment, но проблема еще не решена.Android Keyboard Adjust Resize

+0

вы пробовали [этот ответ] (http://stackoverflow.com/a/ 34563274/2826147) –

ответ

0

В этом есть ошибки Android. После многого, я могу придумать гладкое решение этой проблемы. это однострочное решение, но оно имеет некоторые предварительные требования. Одна линия:

AndroidBug5497Workaround.assistActivity(this, R.id.LayoutInScrollView); 

Ваш XML макет должен быть как:

RelativeLayout{ 

HeaderView{} 

ScrollView{ 
    LinearLayout{ 
    @+id/LayoutInScrollView 
    } 
} 

FooterView{}  // the buttons u want to appear above keyboard 
} 

Если вы не используете полный экран, следующий класс должен быть достаточно:

class AndroidBug5497Workaround{ 

    View svChildLayout; 
    int originalGravity; 
    Activity activity; 

    /** 
    * @param activity 
    * @param svChildLayoutId id of the layout that is the first child of the center ScrollView 
    */ 
    public static void assistActivity (Activity activity, int svChildLayoutId) { 
     new AndroidBug5497Workaround(activity, svChildLayoutId); 
    } 


    private AndroidBug5497Workaround(Activity activity, int svChildLayoutId) { 

     this.activity = activity; 
     svChildLayout = activity.findViewById(svChildLayoutId); 
     originalGravity = ((ScrollView.LayoutParams)svChildLayout.getLayoutParams()).gravity; 

     //Add listener 
     FrameLayout content = (FrameLayout) activity.findViewById(android.R.id.content); 
     mChildOfContent = content.getChildAt(0); 
     mChildOfContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      public void onGlobalLayout() { 
       possiblyResizeChildOfContent2(); 
      } 
     }); 

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


    private void onKeyboardVisible() { 

     ScrollView.LayoutParams params = (ScrollView.LayoutParams) svChildLayout.getLayoutParams(); 
     params.gravity = Gravity.TOP; 
     svChildLayout.requestLayout(); 

     final ScrollView parentSv = (ScrollView) svChildLayout.getParent(); 
     parentSv.post(new Runnable() { 
      @Override 
      public void run() { 
       View focusedEditText = activity.getWindow().getCurrentFocus(); 
       parentSv.smoothScrollTo(0, focusedEditText.getTop()); 
      } 
     }); 
    } 

    private void onKeyboardHidden() { 
     ScrollView.LayoutParams params = (ScrollView.LayoutParams) svChildLayout.getLayoutParams(); 
     params.gravity = originalGravity; 
     svChildLayout.requestLayout(); 
    } 
} 

Если вы используете полный экран, вам понадобится следующий класс (измененный с windowSoftInputMode="adjustResize" not working with translucent action/navbar):

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

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

     View svChildLayout; 
     int originalGravity; 
     Activity activity; 

     private AndroidBug5497Workaround(Activity activity, int svChildLayoutId) { 


     this.activity = activity; 
     svChildLayout = activity.findViewById(svChildLayoutId); 
     originalGravity = ((ScrollView.LayoutParams)svChildLayout.getLayoutParams()).gravity; 

      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 
onKeyboardVisible();      
frameLayoutParams.height = usableHeightSansKeyboard - heightDifference; 
       } else { 
        // keyboard probably just became hidden 
onKeyboardHidden();      
frameLayoutParams.height = usableHeightSansKeyboard; 
       } 
       mChildOfContent.requestLayout(); 
       usableHeightPrevious = usableHeightNow; 
      } 
     } 

     private int computeUsableHeight() { 


       Rect r = new Rect(); 
       mChildOfContent.getWindowVisibleDisplayFrame(r); 
       return (r.bottom - r.top); 
      } 

private void onKeyboardVisible() { 

     ScrollView.LayoutParams params = (ScrollView.LayoutParams) svChildLayout.getLayoutParams(); 
     params.gravity = Gravity.TOP; 
     svChildLayout.requestLayout(); 

     final ScrollView parentSv = (ScrollView) svChildLayout.getParent(); 
     parentSv.post(new Runnable() { 
      @Override 
      public void run() { 
       View focusedEditText = activity.getWindow().getCurrentFocus(); 
       parentSv.smoothScrollTo(0, focusedEditText.getTop()); 
      } 
     }); 
    } 

    private void onKeyboardHidden() { 
     ScrollView.LayoutParams params = (ScrollView.LayoutParams) svChildLayout.getLayoutParams(); 
     params.gravity = originalGravity; 
     svChildLayout.requestLayout(); 
    } 
    } 
+0

Спасибо за ваш ответ – Surendran

+0

@usman nice solution. Я сталкиваюсь с аналогичной проблемой, я пытался использовать подобное обходное решение, но оно не работает. Я также попытался использовать ваше обычное обходное решение для каких-либо полноэкранных действий, но это не сработало. также я попробовал полную версию экрана, и он создал дополнительное пространство над клавиатурой. Я опубликовал свою проблему с более подробной информацией [здесь] (https://stackoverflow.com/questions/45328468/scrolling-in-scrollview-inside-a-fragment-in-viewpager-with-soft-keyboard-visibl), я бы ценю вашу помощь. спасибо – Poorya

1

Попробуйте это в AndroidMenifest

android:windowSoftInputMode="stateAlwaysHidden|adjustResize 

В вашем editext использовать этот

android:inputType="textMultiLine|textPostalAddress" 
android:scrollbars="vertical" 
+0

разве ваша проблема не решена? @Surendran –