将optionMenu项目图标保存到共享偏好设置

时间:2017-05-15 02:00:44

标签: android sharedpreferences menuitem android-menu optionmenu

我的片段中有两个不同视图的数据列表,我的默认视图是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>

1 个答案:

答案 0 :(得分:4)

您可以在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,那么您应该在MainActivity的onOptionsItemSelected中return false,否则您的Fragment的optionMenu将无效。

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

2。你的片段setHasOptionsMenu(true);内必须onCreate

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