【问题标题】:Getting Previous State of Android Fragment on Back Button在后退按钮上获取 Android 片段的先前状态
【发布时间】:2014-04-22 11:13:54
【问题描述】:

在一个 android 应用程序中,我有多个片段,在一个片段(片段 A)中,我使用布尔变量在按钮单击时在 GridView 中的两组图像之间切换。 Th GridView 项目单击导致第二个片段(片段 B)。在 Fragment B 上按下 Back 按钮时,Fragment A 中的 gridview 会加载默认的图像集,而不是在继续下一个 Fragment Fragment B 之前设置的图像。

请指导如何恢复以前的图像集而不是默认图像集?

在 MainActivity 中,我在 BackPressed 上实现如下:

@Override
    public void onBackPressed() {
        if (frag instanceof SettingsFragment)
            loadGridViewFragment();
        else if (frag instanceof SingleDuaViewPagerFragment) {
            boolean keyIsFavSel = new SharedPreferencesSupplication().read(SingletonClass.keyIsFavSelected, false);
            if (keyIsFavSel)
                loadDuasListFragment();
            else
                loadGridViewFragment();
        }
        else if (frag instanceof DuasListFragment) {
            boolean keyIsFavSel = new SharedPreferencesSupplication().read(SingletonClass.keyIsFavSelected, false);
            if (keyIsFavSel)
                loadGridViewFragment();
            else
                loadSingleDuaFragment();
        }
        else
            super.onBackPressed();
    }

GridViewFragment.java的OnCreate方法

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //  fragment = new GridViewFragment();
        context = inflater.getContext();
        View view = inflater.inflate(R.layout.fragment_gridview, container, false); 
        ga = new GridViewAdapter(context);
        Btn_lang_Ch = (Button) view.findViewById(R.id.lng_ch);
        Btn_Settings = (Button) view.findViewById(R.id.button_settings);
        favoriteDuas = (Button) view.findViewById(R.id.btn_favorite_duas);
        GridMenu =(GridView) view.findViewById(R.id.gridView1);
    float scalefactor = getResources().getDisplayMetrics().density * 150;
        @SuppressWarnings("deprecation")
        int number = getActivity().getWindowManager().getDefaultDisplay().getWidth();
        int columns = (int) ((float) number / (float) scalefactor);
        GridMenu.setAdapter(ga);
        GridMenu.setNumColumns(columns);    
        setRetainInstance(true);
        return view;

    }

【问题讨论】:

    标签: android gridview android-fragments savestate


    【解决方案1】:

    您应该在片段的onCreate 方法中调用setRetainInstance(true) 或在onSaveInstanceStateonRetainInstanceState 中保存并加载正确的值

    编辑:我通常会这样做:

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }
    
    private View view;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (view == null) {
            context = inflater.getContext();
            view = inflater.inflate(R.layout.fragment_gridview, container, false); 
            ga = new GridViewAdapter(context);
            Btn_lang_Ch = (Button) view.findViewById(R.id.lng_ch);
            Btn_Settings = (Button) view.findViewById(R.id.button_settings);
            favoriteDuas = (Button) view.findViewById(R.id.btn_favorite_duas);
            GridMenu =(GridView) view.findViewById(R.id.gridView1);
            float scalefactor = getResources().getDisplayMetrics().density * 150;
            @SuppressWarnings("deprecation")
            int number = getActivity().getWindowManager().getDefaultDisplay().getWidth();
            int columns = (int) ((float) number / (float) scalefactor);
            GridMenu.setAdapter(ga);
            GridMenu.setNumColumns(columns);
        }
        else {
           // remove view from previously attached ViewGroup
           ViewGroup parent = (ViewGroup) view.getParent();
           parent.removeView(view);
        }    
        return view;
    }
    

    【讨论】:

    • 我在 OnCreate 中调用了 setRetainInstance(true),但仍在加载默认图像。应该保存哪些值?请解释一下。
    • 如果你调用了setRetainInstanceState(true),那么当你回到前一个fragment时,只有onCreateView被调用了……这意味着你应该在onCreateView中返回现有的视图。如果它不为空,我通常只需从其父级中删除视图并返回现有的视图实例。在 onCreateView 中创建视图时将视图保存到全局变量,如果存在则返回现有的。
    • 并且您在 onCreateView 中调用 setRetainInstanceState,而不是在 onCreate 中
    • OnCreateView 拥有绘制 UI 的所有组件,那么在 OnCreate 中应该做什么?
    • 感谢您的帮助,但仍然没有区别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多