首先,Android中的Fragment是什么?
http://developer.android.com/guide/topics/fundamentals/fragments.html
场景:
现有两个Fragment(e.g:LoginFragment、HomeFragment)需要在Android程序运行的时候进行动态加载、切换,这种情况下,比较容器出现的一个问题就是:

// java.lang.IllegalStateException: The specified child already has a// parent. You must call removeView() on the child's parent first.

这里,贴出处理此问题的几个代码片段,备忘之:

// ...@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.i(TAG, "-- onCreateView(...) --");mRootView = (View) inflater.inflate(R.layout.fragment_login, container, false);return mRootView;}// 当FragmentActivity动态切换Fragment的时候,上面代码片段中的container设置为null或者其后的参数设置为false,// 否则会报出异常:// java.lang.IllegalStateException: The specified child already has a// parent. You must call removeView() on the child's parent first.// 另外,对fragment进行remove操作前记得进行非空判断// ...protected void goHome() {FragmentTransaction transaction = getFragmentManager().beginTransaction();HomeFragment homeFragment = new HomeFragment();if (null == getFragmentManager().findFragmentByTag("tag_home")) {transaction.add(R.id.fragment_main, homeFragment, "tag_home");}if (null != getFragmentManager().findFragmentByTag("tag_login")) {transaction.remove(getFragmentManager().findFragmentByTag("tag_login"));}transaction.replace(R.id.fragment_main, homeFragment).setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE).commit();}
main.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:id="@+id/fragment_main"  android:layout_width="fill_parent"  android:layout_height="fill_parent" ></FrameLayout>

The specified child already has a parent. You must call removeView() on the child's parent first.的解决办法

出现The specified child already has a parent. You must call removeView() on the child's parent first.这个问题,一般原因是对layout.xml的使用理解不清楚。
以xml文件方式来设计界面的布局,如果需要动态的对xml文件中的各类View进行修改的话,在代码中使用时,不能直接使用this.findViewById(R.id.***)来获取xml文件中的每个View,然后再将这些View加入到代码中的Layout中来进行显示。正确的做法应该是使用inflater。

举例如下:

xml布局文件test.xml为:

1 <? xmlversion="1.0"encoding="utf-8" ?>
2 < LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
3 android:orientation ="vertical" android:layout_width ="fill_parent"
4 android:layout_height ="fill_parent" >
5
6 < TextView android:id ="@+id/tv1" android:layout_gravity ="center_vertical"
7 android:layout_width ="wrap_content" android:layout_height ="wrap_content"
8 />
9
10 < TextView android:id ="@+id/tv2" android:layout_gravity ="center_vertical"
11 android:layout_width ="wrap_content" android:layout_height ="wrap_content"
12 />
13
14 < TextView android:id ="@+id/tv3"
15 android:layout_gravity ="center_vertical" android:layout_width ="wrap_content"
16 android:layout_height ="wrap_content" />
17
18 < ImageView android:src ="@drawable/line" android:layout_width ="fill_parent"
19 android:layout_height ="fill_parent" />
20
21 </ LinearLayout >
如果你需要使用这个布局XML文件,并根据自己的需要,将其中三个TextView的文字做更改,则在代码中应该这样去使用:
1
2 LayoutInflaterinflate=(LayoutInflater)
3 getSystemService(Context.LAYOUT_INFLATER_SERVICE);
4 LinearLayoutlayout=(LinearLayout)inflate.inflate(R.layout.poemshowlist, null);
5
6 ((TextView)layout.findViewById(R.id.tv1)).setText(text1);
7 ((TextView)layout.findViewById(R.id.tv2)).setText(text2);
8 ((TextView)layout.findViewById(R.id.tv3)).setText(text3);
9
10 LinearLayoutll= newLinearLayout( this);
11 ll.addView(layout);
12 setContentView(ll);
13
14
15


更多相关文章

  1. Android百分比布局初探
  2. Android布局技巧大全(持续更新..........)
  3. Android5大布局方式
  4. android从raw里面读取txt文件
  5. android直接找一个文件,部分编译等实用
  6. Android 保存文件路径方法
  7. Android px和dip及sp的区别及转换代码
  8. Android处适应布局

随机推荐

  1. android 客户端 smtp 协议发送数据
  2. Android获取单选与复选框的值
  3. android 判断文件是否存在
  4. Android之MediaPlayer(两种)基本使用方式
  5. C#内置泛型委托之Func委托
  6. C++单例模式的懒汉模式和饿汉模式详解
  7. ASP.NET CORE实现跨域
  8. C++的数据共享与保护你了解吗
  9. PHP json_encode中文乱码解决方法
  10. Vue.js中v-for指令的用法介绍