I have a simple activity built with HoloEverywhere with one fragment container. ListFragment appears there on start, and appears normally. Then, click on list item replaces ListFragment with another fragment and adds it to backstack. But when I'm pressing back button, list is empty, although it resumes normally. There's some code:
Activity
public class MainActivity extends Activity implements SongsFragment.IActivityCallback {
public final static String TAG = "Lyrics";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "STarted.");
setContentView(R.layout.frags);
}
@Override
public void itemSelected(int id) {
Log.d(TAG, "itemSelected");
LyricsFragment lyrics = new LyricsFragment();
if(findViewById(R.id.frag_frame) != null) {
Bundle args = new Bundle();
args.putInt("id", id);
lyrics.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.frag_frame, lyrics);
transaction.addToBackStack(null);
transaction.commit();
}
}
}
frags layout:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/frag_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<fragment
android:id="@+id/fragment1"
android:name="android.app.ListFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.anth.lyrics.SongsFragment"
tools:layout="@layout/song_fragment" />
</FrameLayout>
LyricsFragment:
public class LyricsFragment extends Fragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
this.container = container;
View ret = inflater.inflate(R.layout.lyricsview, container, false);
return ret;
}
...
SongsFragment:
public class SongsFragment extends ListFragment {
private IActivityCallback callback;
private ArrayList<Song> songs;
final static String TAG = "SOng Fragment";
public interface IActivityCallback {
public void itemSelected(int id);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
TextView t_id = (TextView) v.findViewById(R.id.song_id);
int s_id = Integer.valueOf( t_id.getText().toString() );
Log.d(TAG, "Select item");
callback.itemSelected(s_id);
super.onListItemClick(l, v, position, id);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
callback = (IActivityCallback) getActivity();
DBRead db = new DBRead(getActivity());
songs = db.getLast(10);
db.close();
SongListAdapter adapt = new SongListAdapter(getActivity(), R.layout.songs_item, songs);
setListAdapter(adapt);
}
}
I've tested it on 2.3.3 and on 4.0.4, result was the same. So, how to make it work properly?
Implementing onsaveInstanceSate() method may resole your issue?
When you replace your fragment, I think that the onDestroyView() method is called. You can use transaction.hide(this) instead :
or set your list adapter in the onResume() method, when your fragment is back to foreground, the onResume will be called.