方向更改后,MenuItem alpha值丢失

时间:2014-04-08 19:34:38

标签: android actionbarsherlock menuitem

问题

在Android版本上< 4.1,菜单项的alpha值在方向更改后重置,但仍保持禁用状态。

我使用的代码

DetailsFragment.java

public class DetailsFragment extends SherlockFragment {
private MenuItem miEmail;
...
@Override
public void onPrepareOptionsMenu(Menu menu) {
    miEmail= menu.findItem(R.id.menu_email);
    super.onPrepareOptionsMenu(menu);
   }

private void populateDetails(final Detail oDetail) {
    //disable email button if dealer doesn't have option
    if(!oDetail.bShowSAM){
        miEmail.setEnabled(false);
        miEmail.getIcon().setAlpha(50);
    }
    ...
    }
}

MyManifest.xml

<activity
        android:name=".activities.DetailsActivity"
        android:uiOptions="splitActionBarWhenNarrow" 
        android:configChanges="keyboardHidden|screenSize|orientation">
</activity>

我期待发生什么

当方向改变时,miEmail仍然被禁用且alpha值仍为50.

实际发生的事情

在旧设备(2.3,4.0)上进行测试时,MenuItem仍处于禁用状态,但alpha值将重置为默认值。使用> 4.1的设备进行测试时,它正在按预期工作。

我尝试了什么

谷歌搜索问题.......

我试图避免使用android:configChanges="..."并通过savedInstanceState处理数据,但我们已经了解到,您无法使MenuItem可序列化/可分辨,因此不允许我通过outState bundle对象传递它。

我对Android开发很新,我觉得好像处理这个MenuItem还有一个简单的方法,但是我无法理解如何处理它。

您认为这个问题是什么?

任何反馈都将不胜感激。

1 个答案:

答案 0 :(得分:4)

不要在自定义函数上设置图标alpha,而是将其设置在OnPrepareOptionsMenu上(使用合适的条件)。你可以在savedinstancestate上传递一个布尔值,说明它是否应该变灰。

在你的populateDetails函数中,你会调用invalidateOptionsMenu()来让android重新制作动作栏图标。例如:

private boolean buttonEnabled;
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem miEmail= menu.findItem(R.id.menu_email);
    if (buttonEnabled) {
        miEmail.setEnabled(true);
        miEmail.getIcon().setAlpha(255);
    }else{
        miEmail.setEnabled(true);
        miEmail.getIcon().setAlpha(50);
    }
    return super.onPrepareOptionsMenu(menu);
}
private void populateDetails(final Detail oDetail) {
    //disable email button if dealer doesn't have option
    if(!oDetail.bShowSAM){
        buttonEnabled = false;
        InvalidateOptionsMenu();
    }
    ...
    }
}

如果您使用支持库来实现兼容性,请改用supportInvalidateOptionsMenu。

顺便说一下,永远不要使用方向标签来修复&#34;问题是,如果您长时间退出应用程序然后尝试打开它,问题仍会出现。 (android最初暂停活动并在一段时间后停止它)