Java tutorial
/* * BottomNavigationLayout library for Android * Copyright (c) 2016. Nikola Despotoski (http://github.com/NikolaDespotoski). * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * */ package despotoski.nikola.github.com.bottomnavigationlayout; import android.animation.Animator; import android.animation.AnimatorSet; import android.annotation.TargetApi; import android.content.Context; import android.content.res.Resources; import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.view.ViewCompat; import android.support.v7.app.AppCompatActivity; import android.util.DisplayMetrics; import android.view.Display; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewTreeObserver; import android.view.WindowManager; /** * Created by Nikola on 3/24/2016. */ final class Util { public static void runOnAttachedToLayout(View v, final Runnable runnable) { if (ViewCompat.isLaidOut(v)) runnable.run(); else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { v.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { runnable.run(); v.removeOnLayoutChangeListener(this); } }); return; } final ViewTreeObserver viewTreeObserver = v.getViewTreeObserver(); if (viewTreeObserver != null && viewTreeObserver.isAlive()) { viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { runnable.run(); if (viewTreeObserver.isAlive()) //noinspection deprecation viewTreeObserver.removeGlobalOnLayoutListener(this); } }); } } } public static boolean isNavigationBarTranslucent(Context context) { AppCompatActivity activity = (AppCompatActivity) context; getNavigationBarHeight(context); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH && ViewConfiguration.get(activity).hasPermanentMenuKey()) { return false; } /** * Copy-paste coding made possible by: * http://stackoverflow.com/a/14871974/940036 */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { Display d = activity.getWindowManager().getDefaultDisplay(); DisplayMetrics realDisplayMetrics = new DisplayMetrics(); d.getRealMetrics(realDisplayMetrics); int realHeight = realDisplayMetrics.heightPixels; int realWidth = realDisplayMetrics.widthPixels; DisplayMetrics displayMetrics = new DisplayMetrics(); d.getMetrics(displayMetrics); int displayHeight = displayMetrics.heightPixels; int displayWidth = displayMetrics.widthPixels; boolean hasSoftwareKeys = (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0; if (!hasSoftwareKeys) { return hasSoftwareKeys; } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { return (activity.getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION) != 0; } else { return false; } } public static int getNavigationBarHeight(Context context) { Resources res = context.getResources(); int navBarIdentifier = res.getIdentifier("navigation_bar_height", "dimen", "android"); int navBarHeight = 0; if (navBarIdentifier > 0) { navBarHeight = res.getDimensionPixelSize(navBarIdentifier); } return navBarHeight; } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static void playTogether(Animator... animators) { AnimatorSet set = new AnimatorSet(); set.playTogether(animators); set.start(); } public static void setBackground(View view, @NonNull Drawable drawable) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { view.setBackground(drawable); } else { //noinspection deprecation view.setBackgroundDrawable(drawable); } } public static void setColorToColorDrawable(ColorDrawable color, int colorValue) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { color.setColor(colorValue); } else { color.setColorFilter(colorValue, PorterDuff.Mode.SRC_ATOP); } } }