Pages

comment implementer la navigation drawer avec fragments master detail sujet

samedi 1 février 2014




j essaye de réaliser une application pour des lessons de langue norvegiane
je veux utliser une liste qui affiche un ensempble de verbs puis afficher le detail de chaque verb avec une main navigation drawer
j ai trouver une solution avec une class MasterDetailFragmentHelper reference
http://www.michenux.net/android-navi...rawer-748.html
mais j ai toujours le problem de LoaderCallbacks , quand je click sur la touche back , je quit l application sans erreurs au lieux de retourner sur la liste des verbs

voila le code

MasterDetailFragmentHelper


Code:


import android.content.res.Configuration;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

import java.util.ArrayList;
import java.util.List;

public class MasterDetailFragmentHelper {

        public static MasterDetailFragments getCurrentFragments( int masterView, int detailView, Class<? extends Fragment> detailClass,
                        FragmentManager fm ) {
                MasterDetailFragments masterDetailFragments = new MasterDetailFragments();
               
                List<Fragment> fragmentToRemove = new ArrayList<Fragment>();
               
                Fragment frag1 = fm.findFragmentById(masterView);
                if ( frag1 != null ) {
                        if ( detailClass.isAssignableFrom(frag1.getClass())) {
                                masterDetailFragments.detail = frag1;

                                fm.popBackStackImmediate();
                                fragmentToRemove.add(frag1);

                                frag1 = fm.findFragmentById(masterView);
                                masterDetailFragments.master = frag1;
                                fragmentToRemove.add(frag1);
                        }
                        else {
                                masterDetailFragments.master = frag1;
                                fragmentToRemove.add(frag1);
                        }
                }
               
                Fragment frag2 = fm.findFragmentById(detailView);
                if ( frag2 != null ) {
                        fragmentToRemove.add(frag2);
                        if ( masterDetailFragments.detail == null ) {
                                masterDetailFragments.detail = frag2 ;
                        }
                }       

                FragmentTransaction ft = fm.beginTransaction();
                for( Fragment f : fragmentToRemove ) {
                        ft.remove(f);
                }
                ft.commit();
                fm.executePendingTransactions();
               
                return masterDetailFragments ;
        }

        public static void initFragments( MasterDetailFragments fragments, int masterView, int detailView, Configuration configuration, FragmentManager fm ) {
                boolean dualPanel = configuration.orientation == Configuration.ORIENTATION_LANDSCAPE;

                if (dualPanel) {
                        FragmentTransaction ft = fm.beginTransaction();
                        ft.add(masterView, fragments.master);
                        if ( fragments.detail != null ) {
                                ft.add(detailView, fragments.detail);
                        }
                        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                        ft.commit();
                } else {
                        FragmentTransaction ft = fm.beginTransaction();
                        ft.add(masterView, fragments.master);
                        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                        ft.commit();

                        if ( fragments.detail != null ) {
                                ft = fm.beginTransaction();
                                ft.add(masterView, fragments.detail);
                                ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
                                ft.addToBackStack(null);
                                ft.commit();
                        }
                }
        }
}



class MasterDetailFragments


Code:


import android.support.v4.app.Fragment;

public class MasterDetailFragments {

        public Fragment master ;
       
        public Fragment detail ;
}


class FriendMainFragment


Code:


public class FriendMainFragment extends Fragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        setRetainInstance(false);
        }
       
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragm_main, container, false);

        MasterDetailFragments currentFragments = MasterDetailFragmentHelper
                .getCurrentFragments(R.id.fragmmain_fragment,
                        R.id.fragmdetail_fragment, FriendDetailFragment.class,
                        getChildFragmentManager());
        if ( currentFragments.master == null ) {
            currentFragments.master = FriendListFragment.newInstance();
        }

        MasterDetailFragmentHelper.initFragments(currentFragments, R.id.fragmmain_fragment,
                R.id.fragmdetail_fragment, getResources().getConfiguration(), getChildFragmentManager());

                return view ;
        }
}


class FriendListFragment


Code:


public class FriendListFragment extends ListFragment implements
                LoaderManager.LoaderCallbacks<Cursor> ,TextToSpeech.OnInitListener{

        private TextToSpeech tts;
       
        private TextView txtos;
        /**
        *
        */
        private SimpleCursorAdapter adapter;

        /**
        *
        */
        private boolean dualPanel;

        /**
        * @return
        */
        public static FriendListFragment newInstance() {
                FriendListFragment frag = new FriendListFragment();
                // Bundle args = new Bundle();
                // frag.setArguments(args);
                return frag;
        }

    /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.ListFragment#onCreateView(android.view.LayoutInflater,
        *      android.view.ViewGroup, android.os.Bundle)
        */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {
                View mainView = inflater.inflate(R.layout.fragmlist, container, false);
                fillData();
                return mainView;
        }

        /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
        */
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);

                tts = new TextToSpeech(getActivity(), null);
                this.dualPanel = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
        }

        /**
        *
        */
        private void fillData() {
                String[] from = new String[] {
                                MyTables.ID_VERB_COL,
                                MyTables.ID_PAGE_COL,
                                MyTables.VERB_COL,
                                MyTables.TEMP1_COL,
                                MyTables.V_IMAG_COL
                                };
                int[] to = new int[] {
                                R.id.tx_list_id_verb,
                                R.id.tx_list_id_page,
                                R.id.tx_list_verb,
                                R.id.tx_list_temp1,
                                R.id.list_image
                                };

                this.getLoaderManager().initLoader(0, null, this);
                this.adapter = new SimpleCursorAdapter(this.getActivity(),
                                R.layout.verb_row, null, from, to, 0);

                this.adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
                        public boolean setViewValue(View paramView, Cursor paramCursor,
                                        int paramInt) {

                                if (paramView.getId() == R.id.list_image) {
                                       
                                        String faceName = CursorUtils.getString(MyTables.V_IMAG_COL, paramCursor);
                                        String friendName = CursorUtils.getString(MyTables.VERB_COL, paramCursor);
                                        //Drawable face = ResourceUtils.getDrawableByName(faceName, FriendListFragment.this.getActivity());
                                        //face.setBounds( 0, 0, 70, 70 );

                                        //TextView textView = (TextView) paramView;
                                        //textView.setText(faceName);
                                        //ImageView displayImage = (ImageView) paramView;
                                        ImageView image=(ImageView) paramView.findViewById(R.id.list_image);
                          //image.setImageResource(getActivity().getResources().getIdentifier("com.app.norsksprak.tarik:drawable/"+MyTables.V_IMAG_COL,null,null));
                                        image.setImageDrawable(        ResourceUtils.getDrawableByName( faceName, getActivity()));
                          //textView.setCompoundDrawablePadding(10);
                                        //textView.setCompoundDrawables(face, null,        null, null);
                                        return true;
                                }
                                return false;
                        }
                });

                this.setListAdapter(this.adapter);
        }

        /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int,
        *      android.os.Bundle)
        */
        public Loader<Cursor> onCreateLoader(int arg0, Bundle bundle) {
                String[] projection = { MyTables.ID_VERB_COL,
                    MyTables.ID_PAGE_COL,
                    MyTables.VERB_COL,
                    MyTables.TEMP1_COL,
                    MyTables.TEMP2_COL,
                    MyTables.TEMP3_COL,
                    MyTables.TRAD_COL,
                    MyTables.EXEMPL_COL,
                    MyTables.V_IMAG_COL,
                    MyTables.VAR1_COL
                };
                CursorLoader cursorLoader = new CursorLoader(this.getActivity(),
                                MyContentProvider.CONTENT_URI, projection, null, null, null);
                return cursorLoader;
        }

        /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished(android.support.v4.content.Loader,
        *      Object)
        */
        public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
                this.adapter.swapCursor(cursor);
        }

        /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset(android.support.v4.content.Loader)
        */
        public void onLoaderReset(Loader<Cursor> cursor) {
                this.adapter.swapCursor(null);
        }

        @Override
        public void onResume() {
                super.onResume();
                if ( this.getListView().getSelectedView() != null ) {
                        ensureVisible(this.getListView(),
                                this.getListView().getSelectedView());
                }
        }
       
        private void ensureVisible(ListView parent, View view) {
                parent.smoothScrollToPosition(parent.getSelectedItemPosition());
//                    Rect rect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
//                    parent.requestChildRectangleOnScreen(view, rect, false);
                }
       
       
        /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.ListFragment#onListItemClick(android.widget.ListView,
        *      android.view.View, int, long)
        */
        @Override
        public void onListItemClick(ListView listView, View view, int position,
                        long id) {
               
                txtos = (TextView) view.findViewById(R.id.tx_list_temp1);
               
                speakOut();
               
                super.onListItemClick(listView, view, position, id);

                Uri detailUri = Uri.parse(MyContentProvider.CONTENT_URI + "/" + id);
                FriendDetailFragment detailFragment = FriendDetailFragment
                                .newInstance(detailUri);
                if (!this.dualPanel) {
                        FragmentHelper.initFragmentWithBackstack(detailFragment,
                    R.id.fragmmain_fragment, this.getParentFragment().getChildFragmentManager());
                } else {
                        FragmentHelper.initFragment(detailFragment,
                                        R.id.fragmdetail_fragment, this.getParentFragment().getChildFragmentManager());
                }
        }
        @Override
        public void onDestroy() {
                // Don't forget to shutdown!
                if (tts != null) {
                        tts.stop();
                        tts.shutdown();
                }
                super.onDestroy();
        }

        @Override
        public void onInit(int status) {
                // TODO Auto-generated method stub

                if (status == TextToSpeech.SUCCESS) {

                       
                        int result = tts.setLanguage(Locale.getDefault());

                        // tts.setPitch(5); // set pitch level

                        // tts.setSpeechRate(2); // set speech speed rate

                        if (result == TextToSpeech.LANG_MISSING_DATA
                                        || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                                Log.e("TTS", "Language is not supported");
                        } else {
                       
                                speakOut();
                        }

                } else {
                        Log.e("TTS", "Initilization Failed");
                }

        }
        private void speakOut() {
                String text = txtos.getText().toString();

                tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
       
        }
}


class FriendDetailFragment


Code:


public class FriendDetailFragment extends Fragment {

        private Uri detailUri;

        private TextView VerbField;
       
        private TextView TempVField ;
       
        private ImageView ImagField ;

    /**
    * @return
    */
    public static FriendDetailFragment newInstance() {
        FriendDetailFragment frag = new FriendDetailFragment();
        return frag;
    }

    /**
        * @param detailUri
        * @return
        */
        public static FriendDetailFragment newInstance(Uri detailUri) {
                FriendDetailFragment frag = new FriendDetailFragment();
                Bundle args = new Bundle();
                args.putParcelable(MyContentProvider.CONTENT_ITEM_TYPE, detailUri);
                frag.setArguments(args);
                return frag;
        }

        /**
        * {@inheritDoc}
        *
        * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
        *      android.view.ViewGroup, android.os.Bundle)
        */
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                        Bundle savedInstanceState) {

                View mainView = inflater.inflate(R.layout.fragmdetail, container,
                                false);
                this.VerbField = (TextView) mainView
                                .findViewById(R.id.friend_name_value);
                this.TempVField = (TextView) mainView
                                .findViewById(R.id.friend_job_value);
                this.ImagField = (ImageView) mainView
                                .findViewById(R.id.friend_face_value);
               
                this.detailUri = (savedInstanceState == null) ? null
                                : (Uri) savedInstanceState
                                                .getParcelable(MyContentProvider.CONTENT_ITEM_TYPE);

                Bundle extras = getArguments();
                if (extras != null && this.detailUri == null) {
                       
                        this.detailUri = extras
                                        .getParcelable(MyContentProvider.CONTENT_ITEM_TYPE);
                }

                if (this.detailUri != null) {
                        fillData(this.detailUri);
                }

                return mainView;
        }

        /**
        * @param uri
        */
        private void fillData(Uri uri) {
                String[] projection = { MyTables.ID_VERB_COL,
                            MyTables.ID_PAGE_COL,
                            MyTables.VERB_COL,
                            MyTables.TEMP1_COL,
                            MyTables.TEMP2_COL,
                            MyTables.TEMP3_COL,
                            MyTables.TRAD_COL,
                            MyTables.EXEMPL_COL,
                            MyTables.V_IMAG_COL,
                            MyTables.VAR1_COL};
               
               
                Cursor cursor = this.getActivity().getContentResolver()
                                .query(uri, projection, null, null, null);
                if (cursor != null) {
                        try {
                                cursor.moveToFirst();

                this.VerbField
                                                .setText(
                                                        CursorUtils.getString(MyTables.VERB_COL, cursor));
                                this.TempVField
                                        .setText(CursorUtils.getString(MyTables.TEMP1_COL, cursor));

                                String faceImg = CursorUtils.getString(MyTables.V_IMAG_COL, cursor);
                                this.ImagField.setImageDrawable(
                                        ResourceUtils.getDrawableByName(
                            faceImg, this.getActivity()));
                               
                        } finally {
                                cursor.close();
                        }
                }
        }

        /**
        * @param selectedItemUri
        */
        public void update(Uri selectedItemUri) {
                this.detailUri = selectedItemUri;
                fillData(this.detailUri);
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
                super.onSaveInstanceState(outState);
                outState.putParcelable(MyContentProvider.CONTENT_ITEM_TYPE,
                                this.detailUri);
        }

        public Uri getDetailUri() {
                return detailUri;
        }
}






Aucun commentaire:

Enregistrer un commentaire