如果动态添加,如何在片段Activity中初始化片段?
How to initiate fragment in fragmentActivity if it is added dynamically?
我有一个 FragmentActivity
,我在其中实现导航抽屉,就像我 select 抽屉列表中的任何项目然后它的片段在 activity 中打开一样。现在我的 XML 显示片段的布局代码如下所示
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
这意味着我在 xml 文件中没有任何片段标签,但我从 activity 动态打开片段,如下所示
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
if(session.isLoggedIn())
{
fragment = new SlidingFragment();
}
else
{
fragment = new LoginFragment();
}
break;
case 1:
fragment = new HomeFragment();
break;
case 2:
fragment = new LoginFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();}
现在我想使用 putFragment 使一个片段的片段状态在定向 changed.so 时保持活动状态,我在 FragmentActivity 的 onSaveInstanceState
方法
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Log.v(TAG, "In frag's on save instance state ");
FragmentManager manager = getSupportFragmentManager();
fr = new RandomFragment();
manager.putFragment(outState, "randomFragment", fr);
}
这里fr
是全局声明的片段实例Fragment fr
,RandomFragment
是我在homeFragment AsyncTaskclass的onPostExecute方法中调用的片段。我不知道 RandomFragment 的启动是否正确,即 fr = new RandomFragment();
因为我的 activity 布局文件中没有片段标签,所以我不知道如何通过 ID 或标签查找片段。我只有一个扩展片段 classes 的片段,我像上面那样称呼它们。我在这里很困惑。我收到错误
02-28 16:28:37.809: E/AndroidRuntime(4336): java.lang.IllegalStateException: Fragment RandomFragment{4247d248} is not currently in the FragmentManager
当我尝试将方向更改为横向时。我在 putFragment 行中收到此错误。在 onRestoreInstanceState 方法中,我为 getFragment
编写代码
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction t = manager.beginTransaction();
if(savedInstanceState != null)
{
fr = (FragmentRandom)manager.getFragment(savedInstanceState, "randomFragment");
}
else
{
fr = new FragmentRandom();
}
t.add(fr, "randomFragment");
t.commit();
}
但是当 onSaveInstanceState
上的 putFragment 执行时我得到错误并且我的应用程序强行停止所以 onRestoreInstanceState
没有执行。
我的实际问题是我不知道我是否以正确的方式启动片段。如果它是正确的,那么为什么我会收到错误消息?我是否也必须对片段的 onSaveInstanceState
方法做任何事情。
您似乎在尝试将片段的全新实例放入片段管理器中。这不仅会导致您看到的问题,如果它有效,您就不会恢复该片段的实例状态。尝试使用片段管理器查找当前片段。
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
FragmentManager manager = getSupportFragmentManager();
Fragment fr = manager.findFragmentById(R.id.frame_container);
manager.putFragment(outState, "randomFragment", fr);
}
我有一个 FragmentActivity
,我在其中实现导航抽屉,就像我 select 抽屉列表中的任何项目然后它的片段在 activity 中打开一样。现在我的 XML 显示片段的布局代码如下所示
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
这意味着我在 xml 文件中没有任何片段标签,但我从 activity 动态打开片段,如下所示
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
if(session.isLoggedIn())
{
fragment = new SlidingFragment();
}
else
{
fragment = new LoginFragment();
}
break;
case 1:
fragment = new HomeFragment();
break;
case 2:
fragment = new LoginFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();}
现在我想使用 putFragment 使一个片段的片段状态在定向 changed.so 时保持活动状态,我在 FragmentActivity 的 onSaveInstanceState
方法
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Log.v(TAG, "In frag's on save instance state ");
FragmentManager manager = getSupportFragmentManager();
fr = new RandomFragment();
manager.putFragment(outState, "randomFragment", fr);
}
这里fr
是全局声明的片段实例Fragment fr
,RandomFragment
是我在homeFragment AsyncTaskclass的onPostExecute方法中调用的片段。我不知道 RandomFragment 的启动是否正确,即 fr = new RandomFragment();
因为我的 activity 布局文件中没有片段标签,所以我不知道如何通过 ID 或标签查找片段。我只有一个扩展片段 classes 的片段,我像上面那样称呼它们。我在这里很困惑。我收到错误
02-28 16:28:37.809: E/AndroidRuntime(4336): java.lang.IllegalStateException: Fragment RandomFragment{4247d248} is not currently in the FragmentManager
当我尝试将方向更改为横向时。我在 putFragment 行中收到此错误。在 onRestoreInstanceState 方法中,我为 getFragment
编写代码@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onRestoreInstanceState(savedInstanceState);
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction t = manager.beginTransaction();
if(savedInstanceState != null)
{
fr = (FragmentRandom)manager.getFragment(savedInstanceState, "randomFragment");
}
else
{
fr = new FragmentRandom();
}
t.add(fr, "randomFragment");
t.commit();
}
但是当 onSaveInstanceState
上的 putFragment 执行时我得到错误并且我的应用程序强行停止所以 onRestoreInstanceState
没有执行。
我的实际问题是我不知道我是否以正确的方式启动片段。如果它是正确的,那么为什么我会收到错误消息?我是否也必须对片段的 onSaveInstanceState
方法做任何事情。
您似乎在尝试将片段的全新实例放入片段管理器中。这不仅会导致您看到的问题,如果它有效,您就不会恢复该片段的实例状态。尝试使用片段管理器查找当前片段。
@Override
protected void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
FragmentManager manager = getSupportFragmentManager();
Fragment fr = manager.findFragmentById(R.id.frame_container);
manager.putFragment(outState, "randomFragment", fr);
}