将选项菜单项图标保存到共享首选项

Save optionMenu item icon to shared preferences

我的 Fragment 中有一个包含两个不同视图的数据列表,我的默认视图是 Listview,另一个是 Gridview。我通过单击工具栏上的图标在这两个视图之间切换。 我在 onOptionsItemSelected 方法中动态设置开关项目图标,如下所示:

//global variables
private int currentViewMode = 0 ;
static final int VIEW_MODE_LISTVIEW = 0;
static final int VIEW_MODE_GRIDVIEW = 1;
.
.
.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.switchView:
            if (VIEW_MODE_LISTVIEW == currentViewMode){
                item.setIcon(R.mipmap.ic_gridview);
                currentViewMode = VIEW_MODE_GRIDVIEW;
            }else {
                item.setIcon(R.mipmap.ic_listview);
                currentViewMode = VIEW_MODE_LISTVIEW;
            }
            switchView();
            SharedPreferences sharedPreferences = activity.getSharedPreferences("ViewMode",currentViewMode);
            SharedPreferences.Editor editor = sharedPreferences.edit();
            editor.putInt("currentViewMode",currentViewMode);
            editor.commit();
            return false;

        default:
            break;
    }
    return super.onOptionsItemSelected(item);
}

我从这样的共享偏好中得到我的观点:

SharedPreferences sharedPreferences = activity.getSharedPreferences("ViewMode",activity.MODE_PRIVATE);
currentViewMode = sharedPreferences.getInt("currentViewMode",VIEW_MODE_LISTVIEW);

但我不知道如何保存项目图标以及如何检索它。

你能帮帮我吗?

菜单

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">

<item
    android:id="@+id/switchView"
    android:title=""
    android:icon="@mipmap/ic_listview"
    app:showAsAction="always"/>

</menu>

您可以在 menu.xml 中为您的 gridView 添加另一个项目然后创建一个布尔值来承载这两个项目的可见性。当你切换到listview时,将gridItem的可见性设置为false,当你切换到gridview时,将listItem设置为false;通过这种方式,您将能够以布尔值形式保存和检索具有共享首选项的可见性。

像这样更改您的代码:

<item
    android:id="@+id/switchListView"
    android:title=""
    android:icon="@mipmap/ic_listview"
    app:showAsAction="always"/>

<item
    android:id="@+id/switchGridView"
    android:title=""
    android:icon="@mipmap/ic_gridview"
    android:visible="false"
    app:showAsAction="always"/>

在你的片段中:

boolean isGridView;

然后:

SharedPreferences myPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
isGridView = myPrefs.getBoolean("menu_item", false);

最后像这样更改您的 onOptionItemSelected 方法:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    SharedPreferences myPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
    final SharedPreferences.Editor editor = myPrefs.edit();
    isGridView = myPrefs.getBoolean("menu_item", false);

    switch (item.getItemId()) {

        case R.id.switchListView:

            if (VIEW_MODE_LISTVIEW == currentViewMode){
                isGridView=true;
                editor.putBoolean("menu_item", isGridView);
                editor.commit();
                activity.invalidateOptionsMenu();
                item.setIcon(R.mipmap.ic_gridview);
                currentViewMode = VIEW_MODE_GRIDVIEW;
            }else {
                isGridView=false;
                editor.putBoolean("menu_item", isGridView);
                editor.commit();
                activity.invalidateOptionsMenu();
                item.setIcon(R.mipmap.ic_listview);
                currentViewMode = VIEW_MODE_LISTVIEW;
            }
            switchView();
            SharedPreferences sharedPreferences = activity.getSharedPreferences("ViewMode",currentViewMode);
            SharedPreferences.Editor et = sharedPreferences.edit();
            et.putInt("currentViewMode",currentViewMode);
            et.commit();
            return false;





        case R.id.switchGridView:
            if (VIEW_MODE_LISTVIEW == currentViewMode){
                isGridView=true;
                editor.putBoolean("menu_item", isGridView);
                editor.commit();
                activity.invalidateOptionsMenu();
                item.setIcon(R.mipmap.ic_gridview);
                currentViewMode = VIEW_MODE_GRIDVIEW;
            }else {
                isGridView=false;
                editor.putBoolean("menu_item", isGridView);
                editor.commit();
                activity.invalidateOptionsMenu();
                item.setIcon(R.mipmap.ic_listview);
                currentViewMode = VIEW_MODE_LISTVIEW;
            }
            switchView();
            sharedPreferences = activity.getSharedPreferences("ViewMode",currentViewMode);
            et = sharedPreferences.edit();
            et.putInt("currentViewMode",currentViewMode);
            et.commit();
            return false;

        default:
            break;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onPrepareOptionsMenu(Menu menu) {
    if(isGridView==true){
        menu.findItem(R.id.switchListView).setVisible(false);
        menu.findItem(R.id.switchGridView).setVisible(true);
    }else{
        menu.findItem(R.id.switchListView).setVisible(true);
        menu.findItem(R.id.switchGridView).setVisible(false);
    }

    super.onPrepareOptionsMenu(menu);
}

重要提示

如何在 Fragments 中实现 optionMenu:

1. 如果您在 MainActivity 中实现了 optionMenu,那么您应该 return false 在 MainActivity 的 onOptionsItemSelected 中,否则您的 Fragment 的 optionMenu 将不起作用。

@Override
public boolean onOptionsItemSelected(MenuItem item){
    switch (item.getItemId()) {
        //
    }
    return false;
}

2. 你必须 setHasOptionsMenu(true); 在你的 onCreate 里面你的 Fragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}