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

包含片段的ActionBar选项卡在重新显示时崩溃

段渊
2023-03-14

02-21 10:25:10.077:E/AndroidRuntime(3916):原因:java.lang.IllegalArgumentException:二进制XML文件行#29:id 0x7F06006E重复,标记为空,或父id 0x0带有com.nexapps.myq.fragments.titleInfo 02-21 10:25:10.077:E/AndroidRuntime(3916):在Android.support.v4.app.fragmentActivity.onCreateView(FragmentActivity.java:275)上10:25:10.077:E/AndroidRuntime(3916):在

我的主要活动:

public class TitleActivity extends SherlockFragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        ...
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ...
        Tab tab = actionBar.newTab().setText(R.string.details);
        tab.setTabListener(new TabListener<TitleDetailsFragment>(this, "details", TitleDetailsFragment.class));
        actionBar.addTab(tab);         
    }

}

选项卡侦听器:公共类TabListener实现com.actionbarsherlock.app.actionbar.TabListener{private Fragment mfragment;private final Activity mactivity;private final String mtag;private final class mclass;

  public TabListener(Activity activity, String tag, Class<T> cls) {
      mActivity = activity;
      mTag = tag;
      mClass = cls;
  }

  public TabListener(Activity activity, String tag, Class<T> clz, Fragment fragment) {
      mActivity = activity;
      mTag = tag;
      mClass = clz;
      mFragment = fragment;
  }

  public void onTabSelected(Tab tab, FragmentTransaction ft) {
      if (mFragment == null) {
          mFragment = Fragment.instantiate(mActivity, mClass.getName());
          ft.add(android.R.id.content, mFragment, mTag);
      } else {
          ft.attach(mFragment);
      }

      TabChangeInterface tci = (TabChangeInterface) mActivity;
      if (tci != null) {
        tci.tabSelect(mTag);
      }
  }

  public void onTabUnselected(Tab tab, FragmentTransaction ft) {
      if (mFragment != null) {
          ft.detach(mFragment);
      }
  }

  public void onTabReselected(Tab tab, FragmentTransaction ft) {
  }

}

public class TitleDetailsFragment extends SherlockFragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.activity_title, container, false);
        return view;
    }
}

r.layout.activity_title:

<fragment
   android:id="@+id/info"
   android:name="foo.TitleInfo"
   ...

我可以删除id(这可以解决这个问题),但这些可以帮助更改状态。有什么想法如何保留ids和解决问题吗?


共有1个答案

穆鸿波
2023-03-14

不能删除嵌入在xml布局中的片段。为此,您应该更改xml以包含 ,然后通过调用:

MyFrag newFragment = new MyFrag();
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container,newFragment,"myFragName")
.addToBackStack("myFragName")//optional
.commit();

假设您使用的是支持包,否则只需将GetSupportFragmentManager()更改为GetFragmentManager()

您可以在这里阅读更多关于使用片段的内容:http://developer.android.com/training/basics/fragments/index.html

编辑:更新以包含基于新信息的代码

r.layout.activity_title:

<LinearLayout 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"
    tools:context=".Title" >

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

TitleActivity.Class:

public class TitleActivity extends SherlockFragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_title);        
         ...
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        ...
        Tab tab = actionBar.newTab().setText(R.string.details);
        tab.setTabListener(new TabListener<TitleDetailsFragment>(this, "details", TitleDetailsFragment.class));
        actionBar.addTab(tab);         
    }

}
<RelativeLayout 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">

    <TextView
        android:id="@+id/textView1"
       android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:textSize="10sp"
        android:textStyle="italic"
        android:text="Details are here!"/>
</RelativeLayout>
public class TitleDetailsFragment extends SherlockFragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       return inflater.inflate(R.layout.details_fragment, container, false);
    }
}
 类似资料:
  • 我已经实现了ActionBarsherlock的示例com.actionBarsherlock.sample.fragments,所有这些都工作得很好,直到当所选选项卡有子片段时设备方向发生变化。 一切都好: 一切都很好,可以旋转设备没有问题。现在,如果我在Fragment2中选择一个列表项来推入Fragment2Child1,在我旋转设备之前,一切都是好的。 设备旋转时不良: tab1->Fra

  • 我有一个,有4个选项卡。

  • 我正在尝试制作一个选项卡,其中我必须在gridview中显示图像,所以我从一个库中制作了普通选项卡,并制作了一个适配器来显示我的主要活动代码中的图像。 我的片段类。 我已将适配器设置如下: 我能够在活动中创建网格视图,但是我用它来声明类中的图像,但在这里我遇到了错误。我在适配器中声明为适配器将调用图像的 Sso。它正确编译,没有任何错误,但它显示运行时错误错误为 那么如何解决这个问题,我必须声明图

  • 我有一个应用程序,它使用选项卡进行导航。通过这些选项卡,我在布局中使用和。 我已经在应用程序的主中配置了这些内容。在这里,我为添加了一个页面更改监听器,并更改了关于位置的选项卡。当按下选项卡时,我也会以另一种方式进行操作。这都没问题。 然后我就有了标签中的内容。它们都扩展了类。第一个必须根据设备改变布局。在横向平板电脑()上,我有一个包含两个片段的布局,而其他设备只有一个片段。这是由appiate

  • 问题内容: 我在StackOverflow中发现了大量这些消息。像其他许多人一样,切换标签时,标签内容重叠也存在相同的问题。我发现的任何建议都无法解决我的问题。 当我的应用启动时,它会正确显示第一个选项卡的内容。当我单击另一个选项卡时,旧内容保留在屏幕上,另一个选项卡的内容也添加在屏幕上。第二次切换选项卡时,所有内容均消失。切换标签不再有用。 我在这里关注了Google的Developer文档。

  • 我正在开发一个应用程序,使用ActionBar导航,我有3个标签(我不使用tabhost)如下图: 在第一个选项卡中,将显示一个名为FragmentListItem的片段,如果单击Item1,FragmentListItem将被另一个名为FragmentItemDetails的片段替换,该片段显示所选项的详细信息。 我的问题是,当我选择Tab2或tab3,然后再次选择Tab1,我得到的不再是fra