【问题标题】:Save fragment changes in navigation drawer在导航抽屉中保存片段更改
【发布时间】:2017-03-10 19:36:31
【问题描述】:

我目前正在开发一个 android 应用程序,它使用带有片段的导航抽屉,每个片段都包含 ImageButtons。用户可以更改这些 ImageButtons 的背景图片。

但是,当我进行更改时,切换到不同的片段,然后切换回初始片段,更改会被重置(ImageButton 背景被重置为默认值)。

我了解我当前的代码在每次选择片段时都会重新创建片段;我怎样才能简单地重新打开我离开它们的状态的碎片?

PS。即使在应用程序关闭并重新打开时也允许我保存这些更改的解决方案会很棒。谢谢!

这是我的主要抽屉活动方法:

public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        android.app.FragmentManager fragmentManager = getFragmentManager();

        if (id == R.id.nav_agni) {
            fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentAgni()).commit();
        } else if (id == R.id.nav_ah_muzen_cab) {
            fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentAhMuzenCab()).commit();
        } else if (id == R.id.nav_ah_puch) {
            fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentAhPuch()).commit();
        } else if (id == R.id.nav_amaterasu) {
            fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentAmaterasu()).commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

这是我的片段之一(它们几乎都一样):

public class FragmentAhMuzenCab extends Fragment {

    View myView;

    public FragmentAhMuzenCab() {
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myView = inflater.inflate(R.layout.god_ah_muzen_cab, container, false);

        //ImageButtons
        //Starter Item + Relics
        final ImageButton starter = (ImageButton) myView.findViewById(R.id.imageStarterItem);
        final ImageButton relic1 = (ImageButton) myView.findViewById(R.id.imageRelic1);
        final ImageButton relic2 = (ImageButton) myView.findViewById(R.id.imageRelic2);

        //Full Build
        final ImageButton item1 = (ImageButton) myView.findViewById(R.id.imageItem1);
        final ImageButton item2 = (ImageButton) myView.findViewById(R.id.imageItem2);
        final ImageButton item3 = (ImageButton) myView.findViewById(R.id.imageItem3);

        final ImageButton item4 = (ImageButton) myView.findViewById(R.id.imageItem4);
        final ImageButton item5 = (ImageButton) myView.findViewById(R.id.imageItem5);
        final ImageButton item6 = (ImageButton) myView.findViewById(R.id.imageItem6);

        starter.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysStarterFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        starter.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "starterDialog");
            }
        });

        relic1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemRelicFragment dialog = ItemRelicFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemRelicFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        relic1.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "relic1Dialog");
            }
        });

        relic2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemRelicFragment dialog = ItemRelicFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemRelicFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        relic2.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "relic2Dialog");
            }
        });

        item1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysFragment dialog = ItemPhysFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        item1.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "item1Dialog");
            }
        });

        item2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysFragment dialog = ItemPhysFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        item2.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "item2Dialog");
            }
        });

        item3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysFragment dialog = ItemPhysFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        item3.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "item3Dialog");
            }
        });

        item4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysFragment dialog = ItemPhysFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        item4.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "item4Dialog");
            }
        });

        item5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysFragment dialog = ItemPhysFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        item5.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "item5Dialog");
            }
        });

        item6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                ItemPhysFragment dialog = ItemPhysFragment.newInstance();
                dialog.setOnListItemSelectedListener(new ItemPhysFragment.OnListItemClickedListener() {
                    public void onListItemClick(int resourceId) {
                        item6.setImageResource(resourceId);
                    }
                });
                dialog.show(getFragmentManager(), "item6Dialog");
            }
        });

        return myView;
    }
}

【问题讨论】:

    标签: android android-fragments navigation-drawer


    【解决方案1】:

    是的,片段被重新创建,我建议你将图像的资源 id 存储在 SharedPreferences 中:

    starter.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View arg0) {
                    ItemPhysStarterFragment dialog = ItemPhysStarterFragment.newInstance();
                    dialog.setOnListItemSelectedListener(new ItemPhysStarterFragment.OnListItemClickedListener() {
                        public void onListItemClick(int resourceId) {
                            ...store the resourceId for this image in the Shared Preferences
                            starter.setImageResource(resourceId);
                        }
                    });
                    dialog.show(getFragmentManager(), "starterDialog");
                }
            });
    

    然后在您的 Fragment 的 onCreate 中,您可以执行以下操作:

    starter.setImageResource(...get resource id from shared prefs);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      相关资源
      最近更新 更多