问题
在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
还有一个简单的方法,但是我无法理解如何处理它。
您认为这个问题是什么?
任何反馈都将不胜感激。
答案 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最初暂停活动并在一段时间后停止它)