- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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/
简短版本: 我有 5 个 fragment ,均由 replace 添加到容器中方法(A -> B -> C -> D -> E),现在我想从我的backStack(C)中删除第3个 fragment
我正在开发一个 Android 应用程序,遇到了一个涉及 Fragments 和 FragmentTransactions 的错误。我创建了一个示例应用程序来演示该问题。这是我正在做的: add Fr
在两个 fragment 上使用导航组件,我的应用程序当前在 navigateUp() 时销毁了一个 fragment 被调用(使用 setupActionBarWithNavController()
我在做navigation component codelab。 在10部分中,我们添加了Deeplink小部件。 我将目的地替换为R.id.flow_step_two_dest val cust
我无法解决 BackStack 的问题。我有 3 个由 Activity 管理的 fragment : 我使用这段代码的 fragment 之间的导航: private void showFragme
过去几天我一直在处理一个问题,但似乎没有找到答案。 描述:我有一个包含抽屉导航的主要 Activity 。抽屉导航的每个项目(单击时)都会创建一个 fragment 。在该 fragment 中,有一
对于我的应用程序,某些 fragment 要求用户在显示之前在对话框中输入 PIN。我有一个 BaseFragment 类,如果需要 pin,我的所有其他 fragment 都会扩展该类。我现在的问题
我有一个包含单个 Activity 的应用程序,该 Activity 使用菜单抽屉进行导航。每次单击菜单抽屉中的项目时,我都会用一个新 fragment 替换显示的 fragment 并将其添加到后台
我试图在调用方法时加载新 fragment 。此方法创建一个新 fragment 并“替换”另一个 fragment : private void showTestFragment(Fragment
您好,如何清除 fragment 回栈我使用下面的逻辑它不起作用... for(int i = 0; i < mFragmentManager.getBackStackEntryCount(); ++
我的导航图有 auth包含 LoginFragment 和 SignUpFragment 的子图: [...] 我想检查这两个目的地中的任何一个当前是否在后台。但不是单独检查每个
我的 ViewPager 有 3 个选项卡。 Tab(3) 包含 2 个 fragment (A) --> (B)。 Tab(1) Tab(2) Tab(3) --> (B) --> (C) 我在Ta
我不确定为什么这不起作用,我查看了文档,看起来这应该可行。 DetailFragment newFragment = new DetailFragment(); FragmentTransaction
我想检查 BackStack 是否为空。我有这样的东西: List l2 = getFragmentManager().getFragments(); if(l2 == null){
概览 您好,我目前正在尝试开发一款采用新 Material 设计和兼容 API15 的 Android 应用程序。这次我想通过在 Activity 中替换它们来仅使用一个 Activity 和多个 f
我在后台堆栈中有 fragment ,这些 fragment 是使用 addtobackstack 函数添加的。当我在不使用 addtobackstack 函数的情况下添加一个 fragment 然后
当用户点击状态栏中的通知时,我正在使用 FCM 显示 fragment 。 当前的应用程序流是这个 MainActivity( fragment A -> fragment B -> fragment
在我的 Activity 中,我正在加载 fragment 并在用户单击项目时将它们添加到后台堆栈。这工作正常,后台加载也很好。 不幸的是,当我旋转设备时, Activity 是空白的。我已经在 SO
我有一个 FragmentActivity,当用户在应用程序中导航时,我用用户选择的 fragment 替换当前 fragment ,并将事务添加到后台堆栈。一切正常,用户可以通过按后退按钮返回到之前
我的 Activity 中有以下代码: public void categoryClicked(int categoryId, String categoryName) {
我是一名优秀的程序员,十分优秀!