在以下代码中,片段正在从布局xml动态膨胀。我面临的问题是,当我旋转设备时,我看不到碎片。
如果我查看fragmentManager,我确实看到片段在那里。它们被添加并附加,但屏幕上没有。
MenuCard extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content);
leftContainer = (FrameLayout) findViewById(R.id.leftContainer);
rightContainer = (FrameLayout) findViewById(R.id.rightContainer);
Fragment fragment = mFragmentManager.findFragmentById(R.id.leftFragment);
if (fragment == null) {
LayoutInflater.from(this).inflate(R.layout.left_fragment, leftContainer);
}
fragment = mFragmentManager.findFragmentById(R.id.rightFragment);
if (fragment == null) {
LayoutInflater.from(this).inflate(R.layout.right_fragment, rightContainer);
}
}
}
}
}
R.layout.left_fragment
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/leftFragment"
android:name="com.example.LeftFragment"
tools:layout="@layout/left_fragment">
</fragment>
R.layout.right_fragment
<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rightFragment"
android:name="com.example.LeftFragment"
tools:layout="@layout/left_fragment">
</fragment>
添加R.layout.content的代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spl"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/leftContainer"
android:layout_width="320dp"
android:layout_height="match_parent"
android:background="#00AFF0"
/>
<FrameLayout
android:id="@+id/rightContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</android.support.v4.widget.SlidingPaneLayout>
答案 0 :(得分:0)
您可以尝试在清单中的片段活动声明中添加以下行:
android:configChanges="screenSize|orientation"
这将阻止onCreate在屏幕方向上更改。对于方向更改的处理,您可以覆盖onConfigurationChanges。
答案 1 :(得分:0)
因此,经过对片段管理器代码的大量阅读后,我遇到了这些神奇的界限:
// For fragments that are created from a layout, when restoring from
// state we don't want to allow them to be created until they are
// being reloaded from the layout.
这意味着我案例的正确代码是
@覆盖 protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);
setContentView(R.layout.content);
leftContainer = (FrameLayout) findViewById(R.id.leftContainer);
rightContainer = (FrameLayout) findViewById(R.id.rightContainer);
LayoutInflater.from(this).inflate(R.layout.left_fragment, leftContainer);
LayoutInflater.from(this).inflate(R.layout.right_fragment, rightContainer);
}
}
SupportFragmentManager将在方向更改时重复使用片段,并且只会使布局膨胀。
答案 2 :(得分:0)
我从未尝试过你的设计,但我发现它很有趣。虽然我不推荐它。
由于方向已更改,因此不会重新创建UI。这是因为未重新创建活动,因此在更改方向时不会触发onCreate
。当屏幕因不同因素而发生变化时,会触发 onCreateView 。我从未在Activity子类中尝试过。它通常在Fragment子类中完成。实际上,onCreate
仅在应用程序因用户操作或崩溃而停止时触发。
如果/当我在Activity中找到 onCreateView 方法的好样本时,我会发布它。