以编程方式删除操作栏阴影

如何从java代码中删除操作栏的投影?

如果我从样式中删除它工作正常。

<style name="MyTheme" parent="Theme.Sherlock"> .... <item name="windowContentOverlay">@null</item> <item name="android:windowContentOverlay">@null</item> .... </style> 

但是我需要从java代码中删除并dynamic添加它。

Solutions Collecting From Web of "以编程方式删除操作栏阴影"

没有办法以编程方式为windowContentOverlay属性设置值。 但是,您可以定义两个不同的主题,一个用于可见ActionBar阴影的活动,另一个用于其他活动:

 <!-- Your main theme with ActionBar shadow. --> <style name="MyTheme" parent="Theme.Sherlock"> .... </style> <!-- Theme without ActionBar shadow (inherits main theme) --> <style name="MyNoActionBarShadowTheme" parent="MyTheme"> <item name="windowContentOverlay">@null</item> <item name="android:windowContentOverlay">@null</item> </style> 

现在,您可以将它们设置为AndroidManifest.xml活动:

 <!-- Activity with ActionBar shadow --> <activity android:name=".ShadowActivity" android:theme="@style/MyTheme"/> <!-- Activity without ActionBar shadow --> <activity android:name=".NoShadowActivity" android:theme="@style/MyNoActionBarShadowTheme"/> 

或者您可以在onCreate()方法中以编程方式设置正确的主题:

 @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.MyNoActionBarShadowTheme); super.onCreate(savedInstanceState); //... } 

如果你不会做更多的主题,那么试试这个。 这对我很好用!

 public void disableActionbarShadow() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { View v = getActivity().findViewById(android.R.id.content); if (v instanceof FrameLayout) { ((FrameLayout) v).setForeground(null); } }else { // kitkat. // v is ActionBarOverlayLayout. unfortunately this is internal class. // if u want to check v is desired class, try this // if(v.getClass().getSimpleName.equals("ActionBarOverlayLayout")) // (we cant use instanceof caz ActionBarOverlayLayout is internal package) View v = ((ViewGroup)getActivity().getWindow().getDecorView()).getChildAt(0); v.setWillNotDraw(true); } } 

从Kitkat(也许),ActionBarOverlayLayout包含在活动的视图树中。
这显示了操作栏阴影(我认为XD)

参考: http : //grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/com/android/internal/widget/ActionBarOverlayLayout.java#79

Becaraful我不知道如果使用支持库版本会发生什么。

定义一个像这样的新风格。 请注意,没有定义父项:

 <style name="ConOver" > <<== no parent <item name="android:windowContentOverlay">@null</item> </style> 

在你的代码上面加上这个:

 // Add this line before setContentView() call // Lets you add new attribute values into the current theme getTheme().applyStyle(R.style.ConOver, true); // Rest stays the same 

声明2样式ne有一个阴影,另一个没有。 在你的清单中定义每个活动的主题。 例如

 <Activity android:theme="@style/ThemeShadow" ...> ... <Activity android:theme="@style/ThemeNoShadow" ...> 

我发现这篇文章: 通过button在Android中更改布局运行时的主题

它允许你改变一个活动的主题,但是它会调用finish()并重新开始活动。 所以,我不知道它会为你想要的。

 import android.app.Activity; import android.content.Intent; public class Utils { private static int sTheme; public final static int THEME_DEFAULT = 0; public final static int THEME_WHITE = 1; public final static int THEME_BLUE = 2; /** * Set the theme of the Activity, and restart it by creating a new Activity of the same type. */ public static void changeToTheme(Activity activity, int theme) { sTheme = theme; activity.finish(); activity.startActivity(new Intent(activity, activity.getClass())); } /** Set the theme of the activity, according to the configuration. */ public static void onActivityCreateSetTheme(Activity activity) { switch (sTheme) { default: case THEME_DEFAULT: activity.setTheme(R.style.FirstTheme); break; case THEME_WHITE: activity.setTheme(R.style.SecondTheme); break; case THEME_BLUE: activity.setTheme(R.style.Thirdheme); break; } } } 

我知道这个问题很老,但这个问题对我来说是新的,所以也可能帮助其他人。

尝试:

  • 。getSupportActionBar()setElevation(0);

或者,如果您不使用自定义操作栏:

  • 。getActionBar()setElevation(0);

我认为这是以编程方式执行的最简单的方法。