Android系统。当屏幕方向改变时,移除膨胀的碎片(纵向< - >横向)?

时间:2017-02-12 06:22:37

标签: android android-fragments

MainActivity会像这样膨胀一个片段:

getSupportFragmentManager().beginTransaction()
            .replace(R.id.dashboard_fragment_container, df, TAG_DASHBOARD_FRAGMENT)
            .commit();

但是当屏幕方向改变时,我希望删除(破坏)这个片段。

检测屏幕即将更改的任何简单方法,以便我可以删除膨胀的碎片?

2 个答案:

答案 0 :(得分:2)

尝试使用onConfigurationChanged()方法。它将检测屏幕方向的变化。

S(0,j) = if j is odd then b[j] + S(0,j-1) else S(0,j-1) [j>0]
S(i,0) = if i is odd then a[i] + S(i-1,0) else S(i-1,0) [i>0]
S(0,0) = max(S(0,1), S(1,0))

在onCreate()中设置这些条件,因为方向更改将再次调用onCreate()方法:

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
        //remove fragment
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

让我知道这是否有效。

答案 1 :(得分:0)

Fragments通常会在configuration更改时重新创建。如果您不希望发生这种情况,请使用

Fragment的构造函数中的

setRetainInstance(true);

这将导致在配置更改期间保留片段。

Docs

现在,当由于方向更改而重新启动Activity时,Android Framework会自动重新创建并添加片段。

如果您想在configuration更改使用期间删除片段:

活动

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

    // Checks the orientation of the screen
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
        Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();

    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
    }
}

同样在Manifest:

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

现在在Activity的onCreate()中使用:

删除片段
    Fragment f = getSupportFragmentManager().findFragmentById(R.id.content_frame);  //your fragment
if(f == null){
    //there is no Fragment
}else{
    //It's already there remove it
    getSupportFragmentManager().beginTransaction().remove(f).commit();
}