簡體   English   中英

旋轉時丟失片段

[英]Losing fragment on rotation

我的應用程序出現問題,即使使用一些最基本的代碼(請參見下文),我也丟失了旋轉的片段視圖。

一切始於偉大:

從肖像開始

旋轉之前:

旋轉到風景

這個故事在其他方面也一樣:

從風景開始

旋轉至人像

我不確定發生了什么。 我嘗試遵循各種教程和代碼示例,並通過日志記錄進行檢查,以確保片段已被保存和還原,但無濟於事。 我究竟做錯了什么?

MainActivity.java

public class MainActivity extends FragmentActivity
{
    private FragmentManager fragment_manager;
    private CharacterMenuFragment characterMenuFragment;
    private CharacterEditFragment characterEditFragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_frame);

        fragment_manager = getSupportFragmentManager();

        if (savedInstanceState != null) {
            characterMenuFragment = (CharacterMenuFragment) fragment_manager.getFragment(savedInstanceState, "characterMenuFragment");
            characterEditFragment = (CharacterEditFragment) fragment_manager.getFragment(savedInstanceState, "characterEditFragment");
        }

        if (characterMenuFragment == null) {
            Log.i("characterMenuFragment", "making new fragment");
            characterMenuFragment = new CharacterMenuFragment();
        } else {
            Log.i("characterMenuFragment", "re-using old fragment");
        }

        if (characterEditFragment == null) {
            Log.i("characterEditFragment", "making new fragment");
            characterEditFragment = new CharacterEditFragment();
        } else {
            Log.i("characterEditFragment", "re-using old fragment");
        }

        fragment_manager.beginTransaction().replace(R.id.menu_frame, characterMenuFragment).commit();
        fragment_manager.beginTransaction().replace(R.id.content_frame, characterEditFragment).commit();
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);

        fragment_manager.putFragment(savedInstanceState, "characterMenuFragment", characterMenuFragment);
        fragment_manager.putFragment(savedInstanceState, "characterEditFragment", characterEditFragment);
    }
}

CharacterEditFragment.java

public class CharacterEditFragment extends Fragment {

    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.hello_world, container, false);
        return view;
    }

}

CharacterMenuFragment.java

public class CharacterMenuFragment extends Fragment {

    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.hello_world, container, false);
        return view;
    }

}

content_frame.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <FrameLayout
        android:id="@+id/menu_frame"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="2" />

</LinearLayout>

hello_world.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</LinearLayout>

嘗試這個:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.content_frame);

    fragment_manager = getSupportFragmentManager();

    if (savedInstanceState != null) {
        characterMenuFragment = (CharacterMenuFragment) fragment_manager.getFragment(savedInstanceState, "characterMenuFragment");
        characterEditFragment = (CharacterEditFragment) fragment_manager.getFragment(savedInstanceState, "characterEditFragment");
    }

    if (characterMenuFragment == null) {
        Log.i("characterMenuFragment", "making new fragment");
        characterMenuFragment = new CharacterMenuFragment();
        fragment_manager.beginTransaction().replace(R.id.menu_frame, characterMenuFragment).commit();
    } else {
        Log.i("characterMenuFragment", "re-using old fragment");
    }

    if (characterEditFragment == null) {
        Log.i("characterEditFragment", "making new fragment");
        characterEditFragment = new CharacterEditFragment();
        fragment_manager.beginTransaction().replace(R.id.content_frame, characterEditFragment).commit();
    } else {
        Log.i("characterEditFragment", "re-using old fragment");
    }
}

將片段管理器移至上述適用的if語句中。 您只是要確保重用現有片段,如果片段不存在,則僅創建一個片段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM