2016-10-10 25 views
0

我正在使用C#/ Xamarin中的android應用程序。如何在方向更改時保留導航抽屜選擇的片段?使用Xamarin

我只使用一個活動,有12個片段。我在主要活動中有一個導航抽屜,其中選擇載入12個片段之一。這是我的MainActivity類的開始。正如你所看到的,OnCreate加載savedInstanceState,並且只在savedInstanceState爲null時才創建片段。

public class MainActivity : AppCompatActivity 
{ 
    private DrawerLayout drawerLayout; 
    private SupportFragment currentFragment = new Weight_Fragment(); 
    private Weight_Fragment mWeightFragment; 
    private Distance_Fragment mDistanceFragment; 
    private Volume_Fragment mVolumeFragment; 
    private Help_Fragment mHelpFragment; 
    private Temperature_Fragment mTempFragment; 
    private Time_Fragment mTimeFragment; 
    private Data_Fragment mDataFragment; 
    private Pressure_Fragment mPressureFragment; 
    private Energy_Fragment mEnergyFragment; 
    private Force_Fragment mForceFragment; 

    protected override void OnCreate(Bundle savedInstanceState) 
    {   
     base.OnCreate(savedInstanceState); 

     // Create UI 
     SetContentView(Resource.Layout.Main); 
     drawerLayout = FindViewById<DrawerLayout>(Resource.Id.drawer_layout); 

     //Init Fragments 
     if (savedInstanceState == null) 
     { 
      mWeightFragment = new Weight_Fragment(); 
      mDistanceFragment = new Distance_Fragment(); 
      mVolumeFragment = new Volume_Fragment(); 
      mHelpFragment = new Help_Fragment(); 
      mTempFragment = new Temperature_Fragment(); 
      mTimeFragment = new Time_Fragment(); 
      mDataFragment = new Data_Fragment(); 
      mPressureFragment = new Pressure_Fragment(); 
      mEnergyFragment = new Energy_Fragment(); 
      mForceFragment = new Force_Fragment(); 

      //Add Fragments to Manager 
      var trans = SupportFragmentManager.BeginTransaction(); 
      trans.Add(Resource.Id.fragmentContainer, mHelpFragment, "Help"); 
      trans.Hide(mHelpFragment); 
      trans.Add(Resource.Id.fragmentContainer, mDistanceFragment, "Distance"); 
      trans.Hide(mDistanceFragment); 
      trans.Add(Resource.Id.fragmentContainer, mVolumeFragment, "Volume"); 
      trans.Hide(mVolumeFragment); 
      trans.Add(Resource.Id.fragmentContainer, mTempFragment, "Temperature"); 
      trans.Hide(mTempFragment); 
      trans.Add(Resource.Id.fragmentContainer, mPressureFragment, "Pressure"); 
      trans.Hide(mPressureFragment); 
      trans.Add(Resource.Id.fragmentContainer, mEnergyFragment, "Energy"); 
      trans.Hide(mEnergyFragment); 
      trans.Add(Resource.Id.fragmentContainer, mForceFragment, "Force"); 
      trans.Hide(mForceFragment); 
      trans.Add(Resource.Id.fragmentContainer, mTimeFragment, "Time"); 
      trans.Hide(mTimeFragment); 
      trans.Add(Resource.Id.fragmentContainer, mDataFragment, "Data Storage"); 
      trans.Hide(mDataFragment); 
      trans.Add(Resource.Id.fragmentContainer, mWeightFragment, "Weight"); 
      trans.Commit(); 
      currentFragment = mWeightFragment; 
     } 

片段之間的導航抽屜開關這樣的:

void NavigationView_NavigationItemSelected(object sender, NavigationView.NavigationItemSelectedEventArgs e) 
    { 
     Toolbar toolbar = FindViewById<Toolbar>(Resource.Id.toolbar); 

     switch (e.MenuItem.ItemId) 
     { 
      case (Resource.Id.nav_weight): 
       toolbar.Title = "Weight"; 
       ShowFragment(mWeightFragment); 
       break; 
      case (Resource.Id.nav_distance): 
       toolbar.Title = "Distance"; 
       ShowFragment(mDistanceFragment); 
       break; 
      case (Resource.Id.nav_volume): 
       toolbar.Title = "Volume"; 
       ShowFragment(mVolumeFragment); 
       break; 
      case (Resource.Id.nav_temperature): 
       toolbar.Title = "Temperature"; 
       ShowFragment(mTempFragment); 
       break; 
      case (Resource.Id.nav_pressure): 
       toolbar.Title = "Pressure"; 
       ShowFragment(mPressureFragment); 
       break; 
      case (Resource.Id.nav_energy): 
       toolbar.Title = "Energy"; 
       ShowFragment(mEnergyFragment); 
       break; 
      case (Resource.Id.nav_force): 
       toolbar.Title = "Force"; 
       ShowFragment(mForceFragment); 
       break; 
      case (Resource.Id.nav_time): 
       toolbar.Title = "Time"; 
       ShowFragment(mTimeFragment); 
       break; 
      case (Resource.Id.nav_data): 
       toolbar.Title = "Data Storage"; 
       ShowFragment(mDataFragment); 
       break; 
      case (Resource.Id.help): 
       toolbar.Title = "Help"; 
       ShowFragment(mHelpFragment); 
       break; 
     } 

我的onSaveInstanceState的重寫是非常簡單的:

public override void OnSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) 
    { 
     base.OnSaveInstanceState(outState, outPersistentState); 
    } 

當設備取向的變化,MainActivity重新啓動時,它重新創建所有碎片,因此顯示mWeightFragment,因爲它是創建碎片時唯一沒有隱藏的碎片。

我對縱向和橫向取向都有單獨的佈局,所以我需要在定位更改時以某種方式更新碎片,以便顯示相應的佈局。我還需要應用程序保持在同一個片段上,而不是在每次方向更改時跳回mWeightFragment。

的onSaveInstanceState使用,只創造了碎片的第一次創建活動結束後,我得到以下錯誤:

未處理的異常: 顯示java.lang.NullPointerException:嘗試寫入到現場「廉政android.support .v4.app.Fragment.mNextAnim'上的空對象引用

但只有在更改方向後。如果我簡單地選擇一個不同的片段,然後改變方向,然後改變方向,它會很好地工作,就像我想要的那樣保持在同一個片段上,但是一旦我嘗試再次改變片段,我就會得到那個錯誤。

回答

0

在您的清單請確保您有:

<activity android:configChanges="orientation|screenSize|keyboardHidden" /> 

另外,還要確保你overtide的OnSavedInstanceState:

protected override void OnSaveInstanceState(Bundle outState) 
    { 
    } 

在類文件

+0

我說我的清單以原來的問題。該行已包含在內。 – siralexsir88

+0

@ siralexsir88更新了我的答案 – jaymarvels

+0

謝謝。如何保存當前片段,然後在活動重新啓動時重新加載? – siralexsir88