簡體   English   中英

重新啟動活動后,如何還原活動的片段?

[英]How do fragments of an activity get restored when the activity restarts?

我正在測試由於內存不足而導致系統終止應用程序進程后用戶進入我的應用程序的情況。 我看到了意外的行為,並希望得到一些幫助。

在我的應用程序中,我有一個活動,將其稱為ActivityA ,它立即創建一個片段Fragment A ,並進行片段替換。 FragmentA顯示一個包含兩個項目的ListView 如果用戶單擊第一項,則會創建第二個片段Fragment B並替換FragmentA 否則,將創建另一個FragmentA並替換原始FragmentA 我正在嘗試創建文件目錄樹。 FragmentA用於目錄,而FragmentB用於文件。

假設用戶點擊了文件。 這是測試中用戶切換到另一個應用程序的階段,由於內存不足,系統終止了我的應用程序進程。 然后,用戶返回我的應用程序,期望一切都保持原樣。 但是,實際發生的是正在顯示Fragment A (父目錄)而不是Fragment B (文件)。 當用戶單擊“后退”按鈕時,將顯示Fragment B (文件)。 我做錯了什么導致系統以這種方式還原Backstack?

這是一個示例程序,可以進一步顯示我的應用程序在做什么:

// ActivityA.java
public class ActivityA extends AppCompatActivity implements onItemClickListener
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        FragmentA fragA = new FragmentA();
        FragmentTransaction fragmentTransaction = 
            getSupportFragmentManager().beginTransaction();
        fragmentTransation.replace(R.id.basic_frame, fragA);
        fragmentTransaction.commit();
    }

    @Override
    public void onItemClick(AdapterView<?> aView, View v, int position, long id)
    {
        if (position == 0)
        {
            FragmentB fragB = new FragmentB();
            FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();
            fragmentTransation.replace(R.id.basic_frame, fragB);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
        else
        {
            FragmentB fragA = new FragmentA();
            FragmentTransaction fragmentTransaction = 
                getSupportFragmentManager().beginTransaction();
            fragmentTransation.replace(R.id.basic_frame, fragA);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    }
}

當您調用super.onCreate() ,當savedInstanceState不為null時,片段會自動恢復其當前狀態。

因此,如果希望通過添加初始片段來進行一次設置,則應始終使用if (savedInstanceState == null)檢查將其包圍起來:

@Override
public void onCreate(Bundle savedInstanceState)
{
    // I assume you accidentally left out these lines
    super.onCreate(savedInstanceState);
    setContentView(R.id.your_content_view);

    if (savedInstanceState == null) {
        FragmentA fragA = new FragmentA();
        FragmentTransaction fragmentTransaction = 
        getSupportFragmentManager().beginTransaction();
        fragmentTransation.replace(R.id.basic_frame, fragA);
        fragmentTransaction.commit();
    }
}

暫無
暫無

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

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