BackStack片段在旋转时为空白

冷淡的奇妙

在我的活动中,我正在加载片段,并在用户单击项目时将其添加到后台。这可以正常工作,并且后堆栈可以很好地加载。

不幸的是,当我旋转设备时,活动为空白。我已经在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方法内部。仍然没有用。

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

MLProgrammer-CiM

根据重新创建活动的方式,您可能需要手动处理片段状态更改。在最坏的情况下,您可能需要分离并重新连接该片段以强制重新创建视图。

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

BackStack片段在旋转时为空白

来自分类Dev

Android-从Backstack返回时的空白片段

来自分类Dev

Android从Backstack还原给我空白片段

来自分类Dev

第二次加载时片段为空白

来自分类Dev

片段到活动Backstack返回空白视图

来自分类Dev

恢复旋转时嵌套的片段

来自分类Dev

ExpandableListView 在片段中为空白

来自分类Dev

使用片段和Backstack时管理操作栏标题

来自分类Dev

使用片段和Backstack时管理操作栏标题

来自分类Dev

旋转后片段字段为空

来自分类Dev

包含ListView的选项卡片段在第二次被选择时为空白

来自分类Dev

屏幕旋转时Android复制片段

来自分类Dev

使用导航抽屉旋转时片段变化

来自分类Dev

屏幕旋转时片段活动崩溃

来自分类Dev

片段旋转时的android重复动作菜单

来自分类Dev

屏幕旋转时的片段视图状态

来自分类Dev

Backstack android片段导航

来自分类Dev

BackStack android片段

来自分类Dev

删除BackStack的顶部片段

来自分类Dev

从垂直旋转到水平旋转时合并PageViewer片段

来自分类Dev

在屏幕旋转时显示嵌套片段,而不显示父片段

来自分类Dev

拖动时为空白

来自分类Dev

ViewPager片段中的ListView为空白

来自分类Dev

Backbackpress上的Back Stack片段为空白

来自分类Dev

Android重新排序片段Backstack

来自分类Dev

AsyncTask,片段,视图和Backstack

来自分类Dev

Android重新排序片段Backstack

来自分类Dev

与Backstack中的片段进行通信

来自分类Dev

片段未从BackStack中删除