0

おはようございます! 私は、TabLayout + ViewPagerとその中に2つのフラグメントを持つアクティビティを持っています。最初の断片には、RecyclerViewとツールバーのSearchViewがあります。検索クエリでRecyclerViewが表示されなくなったときにプレースホルダを表示したい(結果が見つからず、RecyclerView.setVisibility(GONE))。だから私のFragment.xmlがあります: android - AdjustResize for Fragment

<?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は私が VISIBLEGONELinearLayoutにRecyclerViewを設定した場合。私が得た問題:私の活動のマニフェストの adjustResizeは、このアクティビティのフラグメントでは機能しません - キーボードの下にある半分のプレースホルダ。私は断片なしのアクティビティと私が唯一のことで同じことをしました - アクティビティマニフェストに 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); 
      } 

素晴らしいです。がんばろう!