屏幕方向改变后片段重置

5

我有一个MainActivity,它在onCreate中加载一个片段。我还有另一个片段,在操作栏中加载。如果我在第一个片段上更改屏幕方向,它按预期工作。如果我在第二个片段上更改,则重置为第一个片段。这似乎是因为它重新构建了一切,并将原始片段放回片段管理器。我确信有一种方法可以跟踪当前显示的片段,但我不确定该如何做。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Database entries
    myDataSource = new FillupDataSource(this);
    myDataSource.open();

    // Create an instance of the MyListFragment 
    MyListFragment firstFragment = new MyListFragment();
    Bundle bundle = new Bundle();
    bundle.putSerializable("dataSource", (Serializable) myDataSource);
    firstFragment.setArguments(bundle);

    // Add the fragment to the 'fragment_container' FrameLayout
    getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();

    getActionBar().setDisplayHomeAsUpEnabled(true);
}

我相信这一定是已经做过很多次的事情,但是我不知道该如何搜索。

3个回答

2
一种可能的解决方案是使用实例状态保存当前片段索引:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
   //save current fragment index
}

然后恢复状态

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
    //have the activity switch the fragment via the saved fragment index
}

您可以在此篇SO帖子中了解更多关于实例状态的内容。

2

在极端情况下,如果您的应用程序不需要在屏幕方向更改时更新资源,您可以在清单文件中使用以下语句:

<activity android:name=".MyActivity"
      android:configChanges="orientation"
      android:label="@string/app_name">

如果您正在开发Android 3.2(API级别13)或更高版本,则需要:

android:configChanges="orientation|screenSize"

然后在您的Activity中,您需要重写onConfigurationChange方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        //do something...   
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        //do something...
    }
}

来自开发者指南的注释:

自己处理配置更改可能会使使用替代资源变得更加困难,因为系统不会自动应用它们。当必须避免由于配置更改而重新启动时,应将此技术视为最后一招,并且不建议用于大多数应用程序。


1
onConfigurationChanged是一个临时解决方案。在极其罕见和特定的情况下可能是必要的,但这里不是这种情况。@Andy最好通过保存/恢复instanceState来清晰地处理更改。configChanges="orientation"并不能涵盖所有可能的配置更改,并且如果您不非常小心(尤其是内存泄漏),它可能会产生许多令人讨厌的副作用。 - Teovald

-1

这是因为屏幕方向改变时,活动会重新启动。

选项是不允许活动重新启动。

对于该活动,在AndroidManifest文件中进行如下操作。(对于我的情况,该活动称为MainActivity。)

//Specify what is done on configuration changes, this line will help you invoke configuration changes in the activity

<activity android:name=".MainActivity" android:configChanges="orientation|keyboardHidden|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

现在调用下面的方法:

  @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){

//Only if you want to do something here. If you dont want then leave it blank

            Toast.makeText(this, "Landscape Mode", Toast.LENGTH_SHORT).show();

        }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){

//Only if you want to do something here too.

            Toast.makeText(this, "Portrait Mode", Toast.LENGTH_SHORT).show();
        }
    }

就像魔术一样,它完美地运作。我已经测试过了。

试试看,看看它是否能正常工作。如果不能,请请求另一个替代方案,我会提供的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接