Last active
November 3, 2016 03:37
-
-
Save shawnlinboy/5346207 to your computer and use it in GitHub Desktop.
一个扩展后的魅族SmartBar工具类,增加三种隐藏SmartBar的方法,过期一种方法。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package in.mobilelin.smartbar; | |
import java.lang.reflect.Field; | |
import java.lang.reflect.InvocationTargetException; | |
import java.lang.reflect.Method; | |
import android.app.ActionBar; | |
import android.content.Context; | |
import android.content.res.Configuration; | |
import android.os.Build; | |
import android.support.v4.app.FragmentActivity; | |
import android.view.View; | |
import android.view.Window; | |
import android.view.WindowManager; | |
public class SmartBarUtils { | |
public static final int SMART_BAR_HEIGH = 96; | |
/** | |
* 调用 ActionBar.setTabsShowAtBottom(boolean) 方法。 如果 | |
* android:uiOptions="splitActionBarWhenNarrow",则可设置ActionBar Tabs显示在底栏。 | |
* | |
* 示例: public class MyActivity extends Activity implements | |
* ActionBar.TabListener { protected void onCreate(Bundle | |
* savedInstanceState) { super.onCreate(savedInstanceState); ... | |
* | |
* final ActionBar bar = getActionBar(); | |
* bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); | |
* SmartBarUtils.setActionBarTabsShowAtBottom(bar, true); | |
* | |
* bar.addTab(bar.newTab().setText("tab1").setTabListener(this)); | |
* ... } } | |
* | |
*/ | |
public static void setActionBarTabsShowAtBottom(ActionBar actionbar, | |
boolean showAtBottom) { | |
try { | |
Method method = Class.forName("android.app.ActionBar").getMethod( | |
"setTabsShowAtBottom", new Class[] { boolean.class }); | |
try { | |
method.invoke(actionbar, showAtBottom); | |
} catch (IllegalArgumentException e) { | |
e.printStackTrace(); | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} catch (InvocationTargetException e) { | |
e.printStackTrace(); | |
} | |
} catch (SecurityException e) { | |
e.printStackTrace(); | |
} catch (NoSuchMethodException e) { | |
e.printStackTrace(); | |
} catch (ClassNotFoundException e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 调用 ActionBar.setActionBarViewCollapsable(boolean) 方法。 | |
* 设置ActionBar顶栏无显示内容时是否隐藏。 | |
* | |
* 示例: | |
* | |
* public class MyActivity extends Activity { | |
* | |
* protected void onCreate(Bundle savedInstanceState) { | |
* super.onCreate(savedInstanceState); ... | |
* | |
* final ActionBar bar = getActionBar(); | |
* | |
* // 调用setActionBarViewCollapsable,并设置ActionBar没有显示内容,则ActionBar顶栏不显示 | |
* SmartBarUtils.setActionBarViewCollapsable(bar, true); | |
* bar.setDisplayOptions(0); } } | |
*/ | |
public static void setActionBarViewCollapsable(ActionBar actionbar, | |
boolean collapsable) { | |
try { | |
Method method = Class.forName("android.app.ActionBar").getMethod( | |
"setActionBarViewCollapsable", | |
new Class[] { boolean.class }); | |
try { | |
method.invoke(actionbar, collapsable); | |
} catch (IllegalArgumentException e) { | |
e.printStackTrace(); | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} catch (InvocationTargetException e) { | |
e.printStackTrace(); | |
} | |
} catch (SecurityException e) { | |
e.printStackTrace(); | |
} catch (NoSuchMethodException e) { | |
e.printStackTrace(); | |
} catch (ClassNotFoundException e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 调用 ActionBar.setActionModeHeaderHidden(boolean) 方法。 设置ActionMode顶栏是否隐藏。 | |
* | |
* public class MyActivity extends Activity { | |
* | |
* protected void onCreate(Bundle savedInstanceState) { | |
* super.onCreate(savedInstanceState); ... | |
* | |
* final ActionBar bar = getActionBar(); | |
* | |
* // ActionBar转为ActionMode时,不显示ActionMode顶栏 | |
* SmartBarUtils.setActionModeHeaderHidden(bar, true); } } | |
*/ | |
public static void setActionModeHeaderHidden(ActionBar actionbar, | |
boolean hidden) { | |
try { | |
Method method = Class.forName("android.app.ActionBar").getMethod( | |
"setActionModeHeaderHidden", new Class[] { boolean.class }); | |
try { | |
method.invoke(actionbar, hidden); | |
} catch (IllegalArgumentException e) { | |
e.printStackTrace(); | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} catch (InvocationTargetException e) { | |
e.printStackTrace(); | |
} | |
} catch (SecurityException e) { | |
e.printStackTrace(); | |
} catch (NoSuchMethodException e) { | |
e.printStackTrace(); | |
} catch (ClassNotFoundException e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 原隐藏SmartBar的方法 | |
* 此方法已从Flyme2.4.1开始失效 示例: | |
* | |
* final ActionBar actionBar = getActionBar(); SmartBarUtils.hide(this); | |
* | |
*/ | |
@Deprecated | |
public static final void hide(FragmentActivity activity) { | |
ActionBar actionBar = activity.getActionBar(); | |
if (actionBar == null) { | |
return; | |
} | |
Class<? extends ActionBar> ActionBarClass = actionBar.getClass(); | |
Method setTabsShowAtBottom; | |
try { | |
setTabsShowAtBottom = ActionBarClass.getMethod( | |
"setTabsShowAtBottom", Boolean.TYPE); | |
setTabsShowAtBottom.invoke(activity.getActionBar(), true); | |
} catch (NoSuchMethodException e) { | |
e.printStackTrace(); | |
} catch (IllegalArgumentException e) { | |
e.printStackTrace(); | |
} catch (IllegalAccessException e) { | |
e.printStackTrace(); | |
} catch (InvocationTargetException e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 以下三个方法原作者为c跳跳(http://weibo.com/u/1698085875), | |
* 由Shawn(http://weibo.com/linshen2011)在其基础上改进了一种判断SmartBar是否存在的方法, | |
* 注意该方法反射的接口只存在于2013年6月之后魅族的flyme固件中 | |
*/ | |
/** | |
* 方法一:uc等在使用的方法(新旧版flyme均有效), | |
* 此方法需要配合requestWindowFeature(Window.FEATURE_NO_TITLE | |
* )使用,缺点是程序无法使用系统actionbar | |
* | |
* @param decorView | |
* window.getDecorView | |
*/ | |
public static void hide(View decorView) { | |
if (!hasSmartBar()) | |
return; | |
try { | |
@SuppressWarnings("rawtypes") | |
Class[] arrayOfClass = new Class[1]; | |
arrayOfClass[0] = Integer.TYPE; | |
Method localMethod = View.class.getMethod("setSystemUiVisibility", | |
arrayOfClass); | |
Field localField = View.class | |
.getField("SYSTEM_UI_FLAG_HIDE_NAVIGATION"); | |
Object[] arrayOfObject = new Object[1]; | |
try { | |
arrayOfObject[0] = localField.get(null); | |
} catch (Exception e) { | |
} | |
localMethod.invoke(decorView, arrayOfObject); | |
return; | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 方法二:此方法需要配合requestWindowFeature(Window.FEATURE_NO_TITLE)使用 | |
* ,缺点是程序无法使用系统actionbar | |
* | |
* @param context | |
* @param window | |
*/ | |
public static void hide(Context context, Window window) { | |
hide(context, window, 0); | |
} | |
private static int getStatusBarHeight(Context context) { | |
int result = 0; | |
int resourceId = context.getResources().getIdentifier( | |
"status_bar_height", "dimen", "android"); | |
if (resourceId > 0) { | |
result = context.getResources().getDimensionPixelSize(resourceId); | |
} | |
return result; | |
} | |
/** | |
* 方法三:需要使用顶部actionbar的应用请使用此方法 | |
* | |
* @param context | |
* @param window | |
* @param smartBarHeight | |
* set SmartBarUtils.SMART_BAR_HEIGHT_PIXEL | |
*/ | |
public static void hide(Context context, Window window, int smartBarHeight) { | |
if (!hasSmartBar()) { | |
return; | |
} | |
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { | |
return; | |
} | |
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, | |
WindowManager.LayoutParams.FLAG_FULLSCREEN); | |
window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); | |
int statusBarHeight = getStatusBarHeight(context); | |
window.getDecorView() | |
.setPadding(0, statusBarHeight, 0, -smartBarHeight); | |
} | |
/** | |
* 新型号可用反射调用Build.hasSmartBar()来判断有无SmartBar | |
* @return | |
*/ | |
public static boolean hasSmartBar() { | |
try { | |
Method method = Class.forName("android.os.Build").getMethod( | |
"hasSmartBar"); | |
return ((Boolean) method.invoke(null)).booleanValue(); | |
} catch (Exception e) { | |
} | |
if (Build.DEVICE.equals("mx2")) { | |
return true; | |
} else if (Build.DEVICE.equals("mx") || Build.DEVICE.equals("m9")) { | |
return false; | |
} | |
return false; | |
} | |
} |
不是有示例代码么?
太感谢了,非常好用!
赞
非常好用,赞~
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
if(SmartBarUtils.hasSmartBar()){
final ActionBar bar = getActionBar();
SmartBarUtils.hide(this);
// SmartBarUtils.setActionBarViewCollapsable(getActionBar(), true);
}
为什么我用了没有效果.是在什么时机调用该方法?