【问题标题】:My Spinner View has an elevation shadow acquired from its parent我的 Spinner View 有一个从其父级获取的高度阴影
【发布时间】:2015-07-17 06:46:31
【问题描述】:

我有一个带有两个孩子的 LinearLayout:一个 TextView 和一个 Spinner。获得了我在 style.xml 文件中定义的主题的 LinearLayout 具有用于创建阴影的高程值。然而,出于某种原因,Spinner 也出现了阴影。它似乎是从它的父母那里获得的。如果我从 LinearLayout 父级中删除 android:theme 属性,布局和 Spinner 上的阴影都会消失。

这里发生了什么?我希望我的 Spinner 没有阴影。

另外,如果我为 Spinner 制作自定义主题并将高度设置为 0dp,这将消除阴影,但 Spinner 会遇到其他布局问题。我知道我在这里做错了什么......

这是我的代码。

布局部分:

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:background="@drawable/section_background"
            android:orientation="vertical"
            android:theme="@style/AppTheme.Section">

            <TextView
                android:id="@+id/titleCalendar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:layout_marginLeft="10dp"
                android:layout_marginTop="5dp"
                android:text="Calendar"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:textStyle="bold" />

            <Spinner
                android:id="@+id/calendarSpinner"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:layout_marginRight="20dp"
                android:layout_marginLeft="20dp"/>
        </LinearLayout>

LinearLayout 的主题 (@style/AppTheme.Section):

        <style name="AppTheme.Section">
            <item name="android:elevation">6dp</item>
        </style>

用选项填充 Spinner 的 Java 代码:

     String[] spinnerItems = new String[]{
            "Hello",
            "I Love You",
            "This is a Test"
    };

    calendarSpinner = (Spinner) findViewById(R.id.calendarSpinner);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, spinnerItems);
    adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item );
    calendarSpinner.setAdapter(adapter);

这是它在设备上的外观:

现在,如果我向 Spinner 添加自定义主题...

<Spinner
     android:id="@+id/calendarSpinner"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_marginBottom="10dp"
     android:layout_marginRight="20dp"
     android:layout_marginLeft="20dp"
     android:theme="@style/SpinnerTheme"/>

风格:

 <style name="SpinnerTheme" parent="AppTheme.SpinnerBase">
      <item name="android:elevation">0dp</item>
 </style>

样式父(AppTheme.SpinnerBase):

 <style name="AppTheme.SpinnerBase" parent="Widget.AppCompat.Spinner.Underlined">
 </style>

这是我最终的结果:


微调器下拉菜单在右侧有一条线和一个微调器箭头!

【问题讨论】:

  • @ThMBc 提供的解决方案似乎可以纠正出现的阴影。但是谁能解释为什么 Spinner 视图会投射阴影,即使它本身没有高程值?
  • elevation 在第一个示例中:当在 xml 中声明时,视图会被父样式夸大:因为您声明了海拔,所以它得到了海拔。选择器本身的提升是因为它是一个新的“窗口”,一个对话框或弹出窗口,它具有自己的生命周期,默认实现显示阴影,即使在 Kitkat 和更早版本上也是如此

标签: android android-layout android-spinner android-theme android-elevation


【解决方案1】:

在 xml 布局中,您还可以将高度设置为 0。

 <Spinner
 android:id="@+id/calendarSpinner"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_marginBottom="10dp"
 android:layout_marginRight="20dp"
 android:layout_marginLeft="20dp"
 android:elevation="0dp"/>

如果元素未被识别,则在早期版本的 android 中将忽略该元素。请注意,在某些设备上将此类元素放入 xml 中会导致无法识别的参数后面的所有参数都将被忽略,因此不要将其作为第一个参数。

【讨论】:

  • 我肯定会在未来使用它。我害怕直接在我的 xml 中使用它,以防它可能在旧设备上引发错误。但是,如果它被忽略 - 这可以减轻我的担忧!
猜你喜欢
  • 2020-07-30
  • 2015-11-27
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2019-11-23
相关资源
最近更新 更多