Удалить программную панель тени программно

Как удалить тень из панели действий из java-кода?

Если я удалю из стиля, он работает нормально.

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

Но мне нужно удалить и добавить его динамически из java-кода.

Ответы

Ответ 1

Невозможно установить значение для атрибута 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);

    //...
}

Ответ 2

Если вы не сделаете больше темы, попробуйте это. Это хорошо работает для меня!

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)

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

Беспокойный Я не знаю, что произойдет, если вы используете версию поддерживающей библиотеки.

Ответ 3

Определите новый стиль, подобный этому. Обратите внимание, что родительский параметр не определен:

<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

Ответ 4

Объявить 2 стиля, у ne есть тень, а другая - нет. THEN в вашем манифесте определяют каждую тему деятельности с соответствующей.  например

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

...

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

Ответ 5

Я нашел эту статью: Изменить тему исполнения макета по кнопке Нажмите в 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;
           }
      }
 }

Ответ 6

Я знаю, что этот вопрос старый, но эта проблема была для меня новой, поэтому она может помочь кому-то еще.

Try:

  • getSupportActionBar() setElevation (0);.

Или, если вы не используете настраиваемую панель действий:

  • getActionBar() setElevation (0);.

Я думаю, что это самый простой способ сделать это программно.