当前位置: 首页 > 知识库问答 >
问题:

当方向改变时,如何保留导航抽屉选择的片段?使用Xamarin

家西岭
2023-03-14
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; 
        }   
public override void OnSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
    {
        base.OnSaveInstanceState(outState, outPersistentState);
    }   

但只有在改变方位之后。如果我只是选择一个不同的片段,然后改变方向,然后再改变方向,它工作得很好,就像我想要的那样,停留在同一个片段上,但是当我再次尝试改变片段时,我会得到那个错误。

共有1个答案

邴俊民
2023-03-14

在您的舱单中,请确保您有:

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

还要确保超过OnSavedInstancEstate:

    protected override void OnSaveInstanceState(Bundle outState)
    {
    }

在类文件

 类似资料:
  • 问题内容: 我知道这些类型的问题已经在这里,但仍然找不到这个问题的答案: 我已经创建了一个应用程序,并使用了由该应用程序自动创建的导航抽屉(AndroidStudio) 这是我所拥有的: 还有更多: 我想使用导航抽屉中的按钮显示另一个片段。我想使用此代码,所以请不要向我发送任何制作自己的抽屉的指南或教程。 现在的问题是,我该怎么放 ,并在情况下,我想打开另一个片段?谢谢。 还有一个问题: 如何添加

  • 问题内容: 我想在使用Android的导航抽屉切换片段时保存片段的状态。如果该片段先前已加载,则不应刷新。可能吗? 问题答案: 要保持片段的状态,您必须在片段的内调用。它能做什么: 控制是否在活动重新创建期间保留片段实例(例如通过配置更改)。 这样可以保持活动重新创建的状态,但是在这种情况下,将不会重新创建活动,而是使用抽屉手动切换片段。在这种情况下,您不必在抽屉的click侦听器中创建新的片段,

  • 我想在使用androids导航抽屉切换片段时保存片段的状态。如果片段先前已加载,则不应刷新。有可能吗?

  • 我有一个带有导航抽屉的应用程序,一个活动和许多片段。当我改变设备方向时,我的主要活动是重新创建,出现的是我的主要片段,而不是当前片段。就像我启动应用程序时一样。 如何恢复当前片段以及与所选片段相关的数据? 我看过这篇文章,但它不起作用:用抽屉菜单保存片段状态 提前感谢那些能帮助我的人。

  • 我试过了。我不成功。我正在写我的步骤。如果有人能帮我。 > 使用Android Studio创建新项目并选择“导航抽屉活动” 我将FrameLayout放在主活动中,如下所示 我使用v4创建了新类,如下所示。应用程序。碎片 我制作了碎片管理器,如下所示, 调用**public boolean onNavigationItemSelected(MenuItem项)** 我学了一点,但没能成功。这不是