2016-04-09 26 views
4

私はナビゲーションバーを隠す機能を備えたHTC One A9を所有しています。私のアプリでは、ナビゲーションバーの高さを取得し、それに対応するパディングを設定する必要があります。ここに私の問題があります:ナビゲーションバーを隠すと、パディングはまだ設定されています(Snapchatでもこの問題があります)。私の質問です:これを動作させる代替コードがありますか?Androidでナビゲーションバーの高さを実際に取得する方法

public static int getNavBarHeight(Context context) { 
    int result = 0; 
    int resourceId = context.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); 
    if (resourceId > 0) { 
     result = context.getResources().getDimensionPixelSize(resourceId); 
    } 
    return result; 
} 

ありがとうございました!

+0

あなたは何を達成しようとしていますか?それについていくつかの細部を述べる。たぶん、ナビゲーションバーの高さを計算する必要はありません。 –

+0

@Jabbar_Jigariyo透明なナビゲーションバーを使用している場合、ユーザーがナビゲーションバーを持っているときに、ImageButtonsなどを含むボトムビューにパディングを設定する必要があります –

+0

透明なナビゲーションバーを使用している場合は、それを隠している?ナビゲーションバーを備えたデバイスの場合、既に透過的であり、物理的なボタンを有するデバイスの場合、ナビゲーションバーは存在しない。右 ? –

答えて

6

これはナビゲーションバーのサイズを取得するために使用するコードです。その高さはPoint.yで

クレジットthis answer

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

編集するには次のようになります。あなたの質問に答えるために、私は私のアプリにResideMenuを追加したいので、このfonctionを使用する必要がありましたが、奇妙なを取得終了しましたナビゲーションバーのため、私のアプリの一番下に空の余白があります。

@Override 
protected boolean fitSystemWindows(Rect insets) { 
    // Applies the content insets to the view's padding, consuming that content (modifying the insets to be 0), 
    // and returning true. This behavior is off by default and can be enabled through setFitsSystemWindows(boolean) 
    // in api14+ devices. 

    int bottomPadding = insets.bottom; 

    Point p = getNavigationBarSize(getContext()); 

    if (Build.VERSION.SDK_INT >= 21 && p.x != 0) { 
     Resources resources = getContext().getResources(); 
     int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      bottomPadding += resources.getDimensionPixelSize(resourceId); 
     } 
    } 

    this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top, 
      viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding); 
    insets.left = insets.top = insets.right = insets.bottom = 0; 
    return true; 
} 

希望のお手伝いを致します。

だから私はこのようなResideMenuによって追加このfonctionを編集しました。

+0

ありがとうございました。レイアウトなどのパディングにこのポイントを使用できますか?ありがとう! –

+0

自分のコードでこのポイントをどのように使用するかを示すために私の答えを編集しました。 – ToinToin

+1

コードをコンパイルできません。 – JohnWatsonDev

関連する問題