0

美好的一天,先生们! 我有一个TabLayout + ViewPager和2片段的活动。在第一个片段中,我有一个带有一些项目的RecyclerView和工具栏中的SearchView。当您的搜索查询使RecyclerView消失时(我的意思是您没有找到结果和RecyclerView.setVisibility(GONE)),我想显示占位符。所以这是我的fragment.xml之:android - 调整片段大小

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/pale_grey"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rv_results" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" 
     android:scrollbarThumbVertical="@android:color/darker_gray" 
     android:scrollbarSize="4dp"/> 

    <LinearLayout 
     android:id="@+id/ll_no_categories" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@+id/toolbar" 
     android:gravity="center" 
     android:orientation="vertical" 
     android:visibility="gone" 
     android:fitsSystemWindows="true"> 

     <ImageView 
      android:layout_width="100dp" 
      android:layout_height="100dp" 
      android:layout_marginBottom="24dp" 
      android:visibility="visible" 
      app:srcCompat="@drawable/vector_search_big" /> 

     <TextView 
      android:id="@+id/tv_no_categories" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:gravity="center_horizontal" 
      android:text="@string/activity_home_services_category_list_empty" 
      android:textColor="@color/black_40" 
      android:textSize="16sp"/> 
    </LinearLayout> 
</RelativeLayout> 

所以,当我ItemList.size = 0我设置RecyclerView到GONELinearLayoutVISIBLE。我得到的问题:我的Activity的清单中的adjustResize对于此活动中的片段无效 - 占位符仍在键盘下方一半。我在没有片段的活动中做了同样的事情,也是我做的唯一的事情 - 在Activity Manifest中设置了adjustResize。如何处理这个问题与片段?

That how it looks like

enter image description here

UPD:嗯,我发现我的大小调整片段的解决方案 - 我加fitsSystemWindows在我的活动的根元素=真的 - 但是它破坏我的状态栏...

回答

1

好的,现在我有一个工作解决方案。如果您使用的SDK < 21调整大小正常工作没有任何问题,但如果要调整的SDK> 21只使用自定义类:

package YOUR_PACKAGE_NAME; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.content.res.Resources; 
import android.graphics.Point; 
import android.graphics.Rect; 
import android.os.Build; 
import android.view.Display; 
import android.view.KeyCharacterMap; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.ViewConfiguration; 
import android.view.ViewTreeObserver; 
import android.view.WindowManager; 
import android.widget.FrameLayout; 

import java.lang.reflect.InvocationTargetException; 


public class AdjustResizeHelper { 
    private boolean mHasBackKey = false; 
    private boolean mHasMenuKey = false; 
    // 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 AdjustResizeHelper(activity); 
    } 

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

    private int mNavBarHeight = 0; 

    private AdjustResizeHelper(Activity activity) { 
     mHasMenuKey = ViewConfiguration.get(activity).hasPermanentMenuKey(); 
     mHasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); 

     mNavBarHeight = getNavigationBarSize(activity).y; 

     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 - mNavBarHeight; 
      } 
      mChildOfContent.requestLayout(); 
      usableHeightPrevious = usableHeightNow; 
     } 
    } 

    public static Point getNavigationBarSize(Context context) { 
     Point appUsableSize = getAppUsableScreenSize(context); 
     Point realScreenSize = getRealScreenSize(context); 

     // navigation bar on the right 
     if (appUsableSize.x < realScreenSize.x) { 
      return new Point(realScreenSize.x - appUsableSize.x, appUsableSize.y); 
     } 

     // navigation bar at the bottom 
     if (appUsableSize.y < realScreenSize.y) { 
      return new Point(appUsableSize.x, realScreenSize.y - appUsableSize.y); 
     } 

     // navigation bar is not present 
     return new Point(); 
    } 

    public static Point getAppUsableScreenSize(Context context) { 
     WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     return size; 
    } 

    public static Point getRealScreenSize(Context context) { 
     WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     Display display = windowManager.getDefaultDisplay(); 
     Point size = new Point(); 

     if (Build.VERSION.SDK_INT >= 17) { 
      display.getRealSize(size); 
     } else if (Build.VERSION.SDK_INT >= 14) { 
      try { 
       size.x = (Integer) Display.class.getMethod("getRawWidth").invoke(display); 
       size.y = (Integer) Display.class.getMethod("getRawHeight").invoke(display); 
      } catch (IllegalAccessException e) {} catch (InvocationTargetException e) {} catch (NoSuchMethodException e) {} 
     } 

     return size; 
    } 

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

} 
在活动的 onCreate()方法,你需要调整

然后:

if(Build.VERSION.SDK_INT >= 21) { 
      AdjustResizeHelper.assistActivity(this); 
      } 

它对我来说很棒。祝你好运!