使用MenuItem.setActionView在ActionBarSherlock中保留默认的selectableItemBackground

时间:2012-10-17 03:54:27

标签: android android-actionbar actionbarsherlock

我正在使用拆分ActionBar来显示一些简单的媒体控件。见下文:

Media Controls with Correct Background

我使用MenuItem.setActionView来覆盖快进和快退按钮的默认视图,因为我需要检测用户最初触摸控件的时间(开始倒带)并随后释放控件(以完成倒带)。请参阅以下代码:

            ImageView rewindButton = new ImageView(getBaseContext());
        rewindButton.setId(rewindViewID);
        rewindButton.setClickable(true);
        rewindButton.setImageResource(R.drawable.ic_action_rewind);
        rewindButton.setOnTouchListener(forwardBackwardListener);
        MenuItem rewindMenu = menu.findItem(R.id.menu_rewind);
        rewindMenu.setActionView(rewindButton);
        return true;

这对我来说效果很好,但却产生了意想不到的副作用。当我触摸快进或快退按钮时,我没有获得默认的蓝色背景(如上面的跳过后退控制所示)。它根本不显示背景。我尝试在onTouch处理程序中设置背景但背景没有以与默认处理程序相同的方式填充ActionBar的高度(参见下面的示例图片),似乎有一些填充或边距,但我不知道我不知道如何删除它。

Menu with Short Background

我试过以下但没有运气:

  • 手动设置ImageView的高度以尝试填充ActionBar
  • 从onTouch处理程序返回True或False

有谁知道我怎么解决这个问题?

2 个答案:

答案 0 :(得分:1)

我提出了一种解决方法,即在选择项目时将所有项目的背景设置为小径向渐变。渐变仍然被切断了一点但很难注意到。它使自定义和常规按钮看起来几乎相同。

You end up with something like this

首先,我在名为res / drawable / radialbackground.xml的文件中创建了径向渐变。请注意,最终颜色是透明的,这对于将渐变淡入任何内容非常重要,因此它不会填满整个矩形。

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">

      <gradient
        android:centerX="0.5"
        android:centerY="0.5"
        android:endColor="#00FFFFFF"
        android:gradientRadius="35"
        android:startColor="@color/Gray"
        android:type="radial"
         />
</shape>

然后我创建了一个名为res / drawable / actionitembackground.xml

的StateListDrawable
<?xml version="1.0" encoding="utf-8"?>


<selector xmlns:android="http://schemas.android.com/apk/res/android"
                  android:exitFadeDuration="@android:integer/config_mediumAnimTime" >
        <item android:state_pressed="true" android:drawable="@drawable/radialbackground" />
        <item android:drawable="@android:color/transparent" />
</selector>

然后我将statelistdrawable分配给我的自定义ActionViews的背景:

rewindButton.setBackgroundResource(R.drawable.actionitembackground);

然后我更改了操作栏的样式,以便为常规操作栏项包含此新的径向填充。

所以,在values / styles.xml中我添加了:

<style name="Theme.MyTheme" parent="Theme.Sherlock.Light">
        <item name="android:selectableItemBackground">@drawable/actionitembackground</item>
        <item name="selectableItemBackground">@drawable/actionitembackground</item>
</style>

在我的例子中,基本样式是Theme.Sherlock.Light,但你可以用你想修改的样式替换它。

然后我将该样式设置为AndroidManifest.xml中我的应用程序的样式

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.MyTheme" 
        android:uiOptions="splitActionBarWhenNarrow" >

这似乎比通过尝试调试背景被切断的原因更容易。也许我会在另一天花更多的时间。

答案 1 :(得分:0)

我有完全相同的问题,但在动作栏上有一个微调器,   你需要将你的视图的de minHeight设置为actionBar height:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/drop_down"
android:minHeight="?android:attr/actionBarSize"
>
<Spinner
    android:id="@+id/category_spinner"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/default_selector"
    android:minHeight="?android:attr/actionBarSize"
    android:gravity="center_vertical|right"
    android:paddingRight="5dp"
    />