Enregistrement Fragment de l'État sur le Changement d'Orientation

Je suis de la création d'une application gestionnaire de fichiers pour Android, et deux classes ci-dessous sont la majorité de la logique qui va en faire. Ce que je fais, c'est que sur le démarrage de la ContentList, il ajoute le ContentListFragment pour le conteneur de mise en page dans le ContestList xml. En ajoutant le ContentListFragment, je reçois le chemin d'accès actuel, puis d'appeler setFileDir(String S) qui, en gros, obtient le Fichier à la passé en chemin, d'avoir la liste des Fichiers à cet endroit, l'initialisation de la matrice, puis de l'initialisation de la carte. J'ai ensuite mis l'Adaptateur, fixer la Barre d'Action de l'INTERFACE utilisateur, et le contextuel de la Barre d'Action. Maintenant, à chaque fois qu'un article sur le ContentListFragment est pressé, il en crée une autre ContentListFragment, en utilisant le chemin d'accès de l'élément sélectionné. Le fragment avant est alors ajouté à la pile de retour. Maintenant que tout est bel et bon, le problème vient bien que lorsque l'orientation se produit.

Que setRetainInstance(true) dans le onCreate de ContentListFragment est la seule chose c'est de garder l'ensemble de l'application de la force de fermeture lorsque l'application des changements d'orientation. Cependant, cette façon de causer à l'application de la force de fermeture plus tard, quand j'y revenir après un certain temps (qui est le principal problème que je vais avoir, et ne comprennent pas pourquoi).

J'ai essayé de remplacer l'actuel ContentListFragment avec un nouveau lorsque l'Activité est recréée sur le changement d'orientation (code, ce n'est pas ci-dessous), mais l'application de la force se ferme aussi avec un NullPointerException à setFileDir(), et donc tout le reste tombe à plat.

Comment puis-je enregistrer le fragment de l'état ainsi que sur le changement d'orientation, tout reste le même comme il l'a fait avant le changement d'orientation, et sans elle, la force de fermeture plus tard, quand j'y revenir après un certain temps?

Juste au cas où, mon appli est juste une Activité avec récursive ContentListFragments.

public class ContentList extends DrawerActivity implements ContentListFragment.listFragmentListener{

    //instance variables
    private FragmentManager fm;
    private FragmentTransaction ft;
    private String currentPath;

    //Initializes variables.
    //If Activity is started for the first time, a path to the storage is
    //received.
    //Else, if it's an orientation change, the path is just retained.
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_list);

        if (savedInstanceState == null) {
            fm = getSupportFragmentManager();
            ft = fm.beginTransaction();
            File file = Environment.getExternalStorageDirectory();
            currentPath = file.getPath();
            ft.add(R.id.content_container_fragment_listview, new ContentListFragment());
            ft.commit();
        } else {
            fm = getSupportFragmentManager();
            currentPath = savedInstanceState.getString("PATH");
        }
    }

    //Grabs the currentPath in case of orientation changes.
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("PATH", currentPath);
    }

dfsas

public class ContentListFragment extends SherlockListFragment {
//instance variables
private ArrayList<Item> items;
private ArrayList<Item> copy_move_queue_items;
private ItemAdapter adapter;
private listFragmentListener lfListener;
private String currentPath;
private MenuItem menuItemRename;
//instantiates variables using setFileDir() and the path from the container Activity.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
currentPath = ((ContentList) getActivity()).getCurrentPath();
setFileDir(currentPath);
}
//Gets a reference to Activity interface
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
lfListener = (listFragmentListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ "must implement listFragmentListener");
}
}
//Sets the UI of the listView and the ActionBar
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.content_list_fragment, container, false);
File file = Environment.getExternalStorageDirectory();
String rootPath = file.getPath();
//Sets Action Bar title to current directory, and creates an Up
//affordance if the root path doesn't equal the current Path
getSherlockActivity().getSupportActionBar().setTitle(null);
getSherlockActivity().getSupportActionBar().setLogo(R.drawable.ab_icon);
if (currentPath.equals(rootPath)) {
getSherlockActivity().getSupportActionBar()
.setDisplayHomeAsUpEnabled(false);
getSherlockActivity().getSupportActionBar()
.setHomeButtonEnabled(false);
} else {
getSherlockActivity().getSupportActionBar()
.setDisplayHomeAsUpEnabled(true);
//getSherlockActivity().getSupportActionBar().setTitle("/" +
//(currentPath.substring(currentPath.lastIndexOf("/") +1)));
}
return v;
}
//Sets the long click Contextual Action Mode to the ListView
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setActionMode();
setListAdapter(adapter);
}
//Gets the list of files at the path and adds them to the Item ArrayList,
//initializing the adapter as well
public void setFileDir(String path) {
File file = new File(path);
File[] files = file.listFiles();
Arrays.sort(files, new fileComparator());
items = new ArrayList<Item>();
for (File f : files) {
items.add(new Item(f));
}
adapter = new ItemAdapter(getActivity(), R.layout.content_list_item, items);
}

OriginalL'auteur James Jun | 2012-12-21