Sparen Fragment Staat auf die Ausrichtung Ändern

Ich bin erstellen Sie eine Datei-manager-app für Android, und zwei Klassen sind unten die Mehrheit der Logik, dass geht in tun. Was ich mache ist, dass beim Start der ContentList, es fügt die ContentListFragment der container-layout in der ContestList xml. Durch das hinzufügen der ContentListFragment, bekomme ich den aktuellen Pfad, dann rufen Sie setFileDir(String S), die im Grunde wird die Datei unter dem übergebenen Pfad, immer die Liste der Dateien an, die Lage, die Initialisierung des Arrays, und dann der Initialisierung des Adapters. Ich legen Sie dann den Adapter, legen Sie die Action-Bar UI, und die contextual Action Bar. Nun, jedes mal, wenn ein Element auf der ContentListFragment gedrückt wird, es schafft eine andere ContentListFragment, über den Pfad des ausgewählten Elements. Das fragment, bevor wird dann Hinzugefügt, um die Rückseite stack. Nun, das ist alles schön und gut, das problem kommt aber, wenn die Orientierung Auftritt.

Dass setRetainInstance(true) in der onCreate von ContentListFragment ist das einzige, was halten die ganze app Kraft schließt, wenn die app die Orientierung ändert. Allerdings tun Sie es auf diese Weise dazu, dass die app Kraft schließen später, als ich wieder zu Ihr nach einer Weile (das ist das Haupt problem das ich habe, und kann nicht verstehen, warum).

Ich habe versucht ersetzen Sie die aktuelle ContentListFragment mit einer neuen, wenn die Activity neu erstellt wird auf die Ausrichtung ändern (code dafür ist nicht unten), aber die app Kraft schließt auch mit einer NullPointerException bei setFileDir(), und daher alles andere auseinander fällt.

Wie Speichere ich die fragment-Zustand, so dass auf die Ausrichtung ändern, alles bleibt gleich wie vor die änderung der Ausrichtung und ohne Gewalt schließen später, wenn ich zurück, um es nach einer Weile?

Nur für den Fall, meine app ist nur eine Aktivität mit rekursiven 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);
}

InformationsquelleAutor James Jun | 2012-12-21

Schreibe einen Kommentar