在我的活动中,我正在加载片段,并在用户单击项目时将其添加到后台。这可以正常工作,并且后堆栈可以很好地加载。
不幸的是,当我旋转设备时,活动为空白。我已经在SO和Google上尝试了所有可能的方法。
我尝试自己管理导航,方法是在用户单击时简单地替换片段,然后将其导航为导航。这可以正常工作,但是如果堆栈大于1,我将失去自动编码功能,该功能编码为更改导航抽屉以显示后退箭头。
我尝试删除整个堆栈并按照用户在旋转设备时单击的顺序添加单个片段。这不能很好地工作。似乎删除和替换不合时宜。
我尝试使用fragmentManager.findbytag将片段添加回去,但它抛出了非法状态异常“片段已添加”。我找到了SO上的解决方案来消除过渡。工作一次,然后停止。不知道为什么。
我敬酒了一下,以查看每次更改后堆栈计数,然后我意识到堆栈添加后堆栈仍显示正确的计数,但是页面仍然空白。它甚至需要2次下压才能将活动退出到上一个活动。
我放置了一个断点,以检查片段中是否调用了onCreateView,是的,每次旋转手机时都会调用它。
基本上,自从我放弃以后,我的代码现在看起来像这样。
@Override
protected void onCreate(Bundle savedInstanceState) {
mPosition = 1;
super.onCreate(savedInstanceState);
if(savedInstanceState != null) {
mLastArtistFragmentTag = savedInstanceState.getString(SAVE_FRAGMENT_LAST_ARTIST);
mLastAlbumFragmentTag = savedInstanceState.getString(SAVE_FRAGMENT_LAST_ALBUM);
mLastSongFragmentTag = savedInstanceState.getString(SAVE_FRAGMENT_LAST_SONG);
mLastFragmentType = savedInstanceState.getInt(SAVE_FRAGMENT_LAST_TYPE);
}
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Load();
}
}, 100);
}
void Load() {
findViewById(R.id.loading).setVisibility(View.GONE);
ViewStub stub = (ViewStub) findViewById(R.id.container_stub);
stub.setLayoutResource(R.layout.activity_music);
stub.inflate();
if(mLastArtistFragmentTag == null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.base_container, new Artists(), FRAGMENT_TAG_BASE)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.commit();
}
else {
getSupportFragmentManager().beginTransaction()
.replace(R.id.base_container, new Artists(), FRAGMENT_TAG_BASE)
//.add(R.id.base_container, Albums.newInstance(mLastArtistFragmentTag), mLastArtistFragmentTag)
//.add(R.id.base_container, getSupportFragmentManager().findFragmentByTag(mLastArtistFragmentTag), mLastArtistFragmentTag)
//.addToBackStack(mLastArtistFragmentTag)
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
.commit();
}
}
@Override
public void onSaveInstanceState(Bundle instanceState) {
super.onSaveInstanceState(instanceState);
if(mLastFragmentType != -1) {
instanceState.putString(SAVE_FRAGMENT_LAST_ARTIST, mLastArtistFragmentTag);
instanceState.putString(SAVE_FRAGMENT_LAST_ALBUM, mLastAlbumFragmentTag);
instanceState.putString(SAVE_FRAGMENT_LAST_SONG, mLastSongFragmentTag);
instanceState.putInt(SAVE_FRAGMENT_LAST_TYPE, mLastFragmentType);
}
}
片段代码是这样的
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
final ListView listView = (ListView) inflater.inflate(R.layout.fragment_albums, container, false);
listView.addHeaderView(inflater.inflate(R.layout.header_artist_info, null));
try {
String uri2 = "http://someurl";
NetworkRequest.FetchJSON(Request.Method.GET, uri2, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray songs = response.getJSONArray("songs");
//HashMap<String, Song> recentSongs = new HashMap<String, Song>();
ArrayList<Song> latest = new ArrayList<Song>();
for (int i = 0; i < songs.length(); i++) {
Song s = new Song(songs.getJSONObject(i));
latest.add(s);
}
AlbumListAdapter pgiAdapter = new AlbumListAdapter(getActivity(), latest);
SwingBottomInAnimationAdapter swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(pgiAdapter);
swingBottomInAnimationAdapter.setAbsListView(listView);
listView.setAdapter(swingBottomInAnimationAdapter);
} catch (JSONException ex) {
Toast.makeText(getActivity(), ex.getMessage(), Toast.LENGTH_LONG).show();
}
}
});
} catch (Exception ex) {
Toast.makeText(getActivity(), ex.getMessage(), Toast.LENGTH_LONG).show();
}
return listView;
}
在您问之前,是的,我确实将Load方法移到了onCreate方法内部。仍然没有用。
我真的被困在这里,需要您的帮助。请帮我。谢谢。
根据重新创建活动的方式,您可能需要手动处理片段状态更改。在最坏的情况下,您可能需要分离并重新连接该片段以强制重新创建视图。
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.detach(activeFrag).attach(activeFrag).commit();
}
并在您的AndroidManifest.xml上具有正确的钩子
android:configChanges="orientation|screenSize"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句