it-swarm.com.ru

Удалить тень панели действий программно

Как я могу удалить тень от панели действий из кода Java?.

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

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

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

15
John

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

    //...
}
12
erakitin

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

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

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

8
ytRino

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

<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
Vikram

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

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

...

<Activity 
Android:theme="@style/ThemeNoShadow" ...>
3
Onur A.

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

Пытаться:

  • getSupportActionBar().setElevation(0);

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

  • getActionBar().setElevation(0);

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

2
Ícaro Mota

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

Если supportActionBar.elevation=0f не работает для вас, вы можете удалить тень, установив appBar.targetElevation=0f, но этот метод устарел . Новый метод использует StateListAnimator .

Вы должны установить stateListAnimator в AppBarLayout без повышения, что может быть достигнуто с помощью шагов ниже

  1. Создать ресурс аниматора appbar_animator.xml

    <item
        Android:state_enabled="true"
        app:state_collapsed="false"
        app:state_collapsible="true">
        <objectAnimator
            Android:duration="150"
            Android:propertyName="elevation"
            Android:valueTo="0dp"
            Android:valueType="floatType" />
    </item>
    
    <item Android:state_enabled="true">
        <objectAnimator
            Android:duration="150"
            Android:propertyName="elevation"
            Android:valueTo="0dp"
            Android:valueType="floatType" />
    </item>
    
    <item>
        <objectAnimator
            Android:duration="0"
            Android:propertyName="elevation"
            Android:valueTo="0"
            Android:valueType="floatType" />
    </item>
    

    Android.valueTo="0dp" определяет высоту.

  2. Раздуйте и установите StateListAnimator в appBar

    val stateAnimator=AnimatorInflater.loadStateListAnimator(this,R.animator.appbar_animator);
    appBar.stateListAnimator=stateAnimator
    

StateListAnimator был добавлен в api 21 Lollipop

0
user5459652