我正在使用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'上的空對象引用
但只有在更改方向後。如果我簡單地選擇一個不同的片段,然後改變方向,然後改變方向,它會很好地工作,就像我想要的那樣保持在同一個片段上,但是一旦我嘗試再次改變片段,我就會得到那個錯誤。
我說我的清單以原來的問題。該行已包含在內。 – siralexsir88
@ siralexsir88更新了我的答案 – jaymarvels
謝謝。如何保存當前片段,然後在活動重新啓動時重新加載? – siralexsir88