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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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 FragmentHelper

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
 
/**
 * @author Michenux
 *
 */
public class FragmentHelper {
 
	/**
         * @param frag
         * @param container
         * @param fm
         */
	public static void initFragment( Fragment frag, int container, FragmentManager fm ) {
		FragmentTransaction ft = fm.beginTransaction();
		ft.add(container, frag);
		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		ft.commit();		
	}
 
	/**
         * @param frag
         * @param container
         * @param fm
         */
	public static void initFragmentWithBackstack( Fragment frag, int container, FragmentManager fm ) {
		FragmentTransaction ft = fm.beginTransaction();
        ft.add(container, frag);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        ft.commit();
	}
 
	/**
         * @param container1
         * @param container2
         * @param fm
         */
	public static void swapFragment( int container1, int container2, FragmentManager fm ) {
 
		Fragment f1 = fm.findFragmentById(container1);
		Fragment f2 = fm.findFragmentById(container2);
 
		FragmentTransaction ft = fm.beginTransaction();
		ft.remove(f1);
		ft.remove(f2);
		ft.commit();
		fm.executePendingTransactions();
 
		ft = fm.beginTransaction();
		ft.add(container1, f2);
		ft.add(container2, f1);
		ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
 
		ft.commit();
	}
}

class MasterDetailFragments

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
import android.support.v4.app.Fragment;
 
public class MasterDetailFragments {
 
	public Fragment master ;
 
	public Fragment detail ;
}
class FriendMainFragment

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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;
	}
}