在刷新内容时禁用菜单上的刷新图标



我有一个刷新图标在我的菜单,当点击将刷新活动的内容。但问题是,刷新图标仍然是可点击的,而它是刷新我不想要的。这是我的menu.xml文件

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  tools:context=".MainActivity">
<item
    android:id="@+id/action_refresh"
    android:orderInCategory="100"
    android:icon="@mipmap/ic_refresh"
    android:enabled="true"
    android:title="@string/action_settings"
    app:showAsAction="always"/>

这里是我处理图标点击事件的地方

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_refresh) {
        // getData() fetches the data and updates the display
        getData();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

还有,有没有一种方法可以让图标变暗,这样用户就知道他们已经点击了图标?

单击图标时,使用菜单项的isEnabled()方法检查当前是否启用。如果是,则禁用它,直到加载数据。一旦数据加载成功,您就可以再次启用它。例子:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if(item.isEnabled()) {
            // "Dim" the icon like you said. You can use other alpha values if you like.
            item.getIcon().setAlpha(130);
            // Disable the menu icon
            item.setEnabled(false);
        }
        getData();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

现在,您说您有一个getData()方法,它在获取数据后更新显示。获取数据后,检查Menuitem是否关闭。如果已禁用,则重新启用它。例子:

if(item != null && item.isEnabled() == false) {
        // "Undim" the icon
        item.getIcon().setAlpha(255);
        // Enable it again
        item.setEnabled(true);
    }

您可以使用setEnabled(true)方法来启用/禁用菜单项

您可以创建第二个menu.xml,在单击刷新按钮之后使用。要强制重画菜单,调用invalidateOptionsMenu();

在第二个menu.xml中,刷新按钮可以被禁用,或者切换到另一个按钮,指示用户刷新正在进行中。

解决这个问题最简单的方法是在activity中保持菜单项。

private MenuItem mRefreshItem;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater infl = new MenuInflater(this);
    infl.inflate(R.menu.menu, menu);
    mRefreshItem = menu.findItem(R.id.action_refresh);
    return super.onCreateOptionsMenu(menu);
}
/** Call this when you begin or end loading */
private void setRefreshEnabled(boolean enabled) {
    mRefreshItem.setEnabled(enabled);
}

最新更新