获取“返回”按钮上Android片段的先前状态

获取“返回”按钮上Android片段的先前状态,android,gridview,android-fragments,savestate,Android,Gridview,Android Fragments,Savestate,在android应用程序中,我有多个片段,在其中一个片段(片段A)中,我使用布尔变量在GridView中的两组图像之间切换。第四个GridView项单击将导致第二个片段(片段B)。按片段B上的后退按钮时,片段A中的gridview将加载默认的图像集,而不是在继续下一个片段B之前加载的图像集 请指导如何恢复以前的图像集而不是默认图像集 在MainActivity中,我在BackPressed上实现了如下内容: @Override public void onBackPressed() {

在android应用程序中,我有多个片段,在其中一个片段(片段A)中,我使用布尔变量在GridView中的两组图像之间切换。第四个GridView项单击将导致第二个片段(片段B)。按片段B上的后退按钮时,片段A中的gridview将加载默认的图像集,而不是在继续下一个片段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();
    }
@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方法的GridViewFragment.java

@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;

    }

您应该在
onCreate
fragment方法中调用
setRetainInstance(true)
,或者在
onSaveInstanceState
onRetainInstanceState

编辑:我通常会这样做:

@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();
    }
@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),那个么当你们回到前面的片段时,只调用了onCreateView。。。这意味着您应该在onCreateView中返回现有视图。如果它不为null,我通常只从其父视图中删除视图并返回视图的现有实例。在onCreateView中创建视图时,将视图保存到全局变量,如果存在,则返回现有变量。如果在onCreateView中调用setRetainInstanceState,而不是在onCreateOnCreateView中调用setRetainInstanceState,则所有组件都要绘制UI,那么在OnCreate中应该做什么?感谢您的帮助,但仍然没有区别。