gpt4 book ai didi

android - BackStack Fragments 旋转时空白

转载 作者:行者123 更新时间:2023-11-29 15:15:39 28 4
gpt4 key购买 nike

在我的 Activity 中,我正在加载 fragment 并在用户单击项目时将它们添加到后台堆栈。这工作正常,后台加载也很好。

不幸的是,当我旋转设备时, Activity 是空白的。我已经在 SO 和 Google 上尝试了所有可能的方法。

我尝试自己管理导航,方法是在用户点击时简单地替换 fragment ,并将后退处理为导航。这工作正常,但我失去了我编码的自动功能,如果堆栈大于 1,则更改抽屉导航以显示后退箭头。

我尝试移除整个堆栈并按照设备旋转时用户点击的顺序添加各个 fragment 。这不好用。似乎删除和替换不合时宜。

我尝试使用 fragmentManager.findbytag 添加回 fragment ,但它抛出非法状态异常“fragment 已添加”。我在 SO 上找到了一个解决方案来删除过渡。工作一次然后停止。不知道为什么。

我在 toast 中检查每次更改时显示的后台堆栈计数,我意识到堆栈在添加后仍然显示正确的计数,但页面仍然是空白的。它甚至需要 2 次后压才能将 Activity 退出到上一个 Activity。

我设置了一个断点来检查 fragment 中是否调用了 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);
}

}

fragment 代码是这样的

    @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 方法内部。还是不行。

我真的被困在这里,需要你的帮助。请帮我。谢谢。

最佳答案

根据您重新创建 Activity 的方式,您可能需要手动处理 fragment 状态更改。在最坏的情况下,您可能需要分离并重新附加 fragment 以强制重新创建 View 。

public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.detach(activeFrag).attach(activeFrag).commit();
}

并在您的 AndroidManifest.xml 上设置正确的钩子(Hook)

android:configChanges="orientation|screenSize"

关于android - BackStack Fragments 旋转时空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411398/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com