From:http://www.it165.net/pro/html/201402/9366.html
-
先上一段代码。
TestFragmentActivity.java
01.
package
com.xc.fragment;
02.
import
com.xc.activity.R;
03.
import
android.os.Bundle;
04.
import
android.support.v4.app.FragmentActivity;
05.
import
android.support.v4.app.FragmentManager;
06.
import
android.support.v4.app.FragmentTransaction;
07.
public
class
TestFragmentActivity
extends
FragmentActivity {
08.
@Override
09.
protected
void
onCreate(Bundle savedInstanceState) {
10.
super
.onCreate(savedInstanceState);
11.
setContentView(R.layout.fragment_activity);
12.
FragmentManager fragmentManager = getSupportFragmentManager();
13.
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
14.
fragmentTransaction.add(R.id.fragment,
new
TestFragment());
15.
fragmentTransaction.commit();
16.
}
17.
}
fragment_activity.xml
01.
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02.
<
LinearLayout
xmlns:android
=
"http://schemas.android.com/apk/res/android"
03.
android:layout_width
=
"fill_parent"
04.
android:layout_height
=
"fill_parent"
05.
android:orientation
=
"vertical"
>
06.
<
LinearLayout
07.
android:id
=
"@+id/fragment"
08.
android:layout_width
=
"fill_parent"
09.
android:layout_height
=
"fill_parent"
10.
android:layout_marginTop
=
"50dip"
/>
11.
</
LinearLayout
>
TestFragment.java
01.
package
com.xc.fragment;
02.
import
android.os.Bundle;
03.
import
android.support.v4.app.Fragment;
04.
import
android.view.LayoutInflater;
05.
import
android.view.View;
06.
import
android.view.ViewGroup;
07.
import
android.widget.TextView;
08.
import
com.xc.activity.R;
09.
public
class
TestFragment
extends
Fragment {
10.
@Override
11.
public
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
12.
TextView view = (TextView) inflater.inflate(R.layout.fragment,
null
);
13.
view.setText(
"oooooooooo"
);
14.
return
view;
15.
}
16.
}
fragment.xml
1.
<
TextView
xmlns:android
=
"http://schemas.android.com/apk/res/android"
2.
android:id
=
"@+id/text"
3.
android:layout_width
=
"fill_parent"
4.
android:layout_height
=
"fill_parent"
5.
android:text
=
"lalall"
/>
1。上述代码可以正常运行。出现“oooooooooo”
2。若将TestFragment.java中的代码替换为:
1.
View view = inflater.inflate(R.layout.fragment,
null
);
出现“lalall”
3。若将TestFragment.java中的代码替换为:
1.
View view = inflater.inflate(R.layout.fragment, container);
出错:The specified child already has a parent. You must call removeView() on the child's parent first.
那么根据提示移除父组件里的子布局:
1.
View view = inflater.inflate(R.layout.fragment, container);
2.
((ViewGroup)view.getParent()).removeView(view);
不出错,但什么也不出现,因为view已经被移除了。
4。若将TestFragment.java中的代码替换为:
1.
View view = inflater.inflate(R.layout.fragment, container,
false
);
出现“lalall”
若改为:
1.
View view = inflater.inflate(R.layout.fragment, container,
false
);
2.
((TextView)view).setText(
"!!!!"
);
出现“!!!!”
5。若将TestFragment.java中的代码替换为:
1.
View view = inflater.inflate(R.layout.fragment, container,
true
);
出现和3一样的错误。true和false起到决定性作用。
6。若将TestFragment.java中的代码替换为:
1.
View view = inflater.inflate(R.layout.fragment, container,
true
);
2.
((TextView)view).setText(
"!!!!"
);
出错:android.widget.LinearLayout cannot be cast to android.widget.TextView。
若保持上述代码不动,改变fragment_acivity.xml中的代码:
1.
<
RelativeLayout
2.
android:id
=
"@+id/fragment"
3.
android:layout_width
=
"fill_parent"
4.
android:layout_height
=
"fill_parent"
5.
android:layout_marginTop
=
"50dip"
/>
出错:android.widget.RelativeLayout cannot be cast to android.widget.TextView。
这说明view已经被add到TestFragmentActivity中,并且随着父组件container变化。
7。若将fragment.xml中代码改变为:
01.
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02.
<
merge
xmlns:android
=
"http://schemas.android.com/apk/res/android"
03.
android:layout_width
=
"fill_parent"
04.
android:layout_height
=
"fill_parent"
05.
android:orientation
=
"vertical"
>
06.
<
TextView
07.
android:id
=
"@+id/text"
08.
android:layout_width
=
"fill_parent"
09.
android:layout_height
=
"fill_parent"
10.
android:text
=
"lalall"
/>
11.
</
merge
>
TestFragment.java中代码改变为:
1.
View view = inflater.inflate(R.layout.fragment,
null
,
true
);
或:
1.
View view = inflater.inflate(R.layout.fragment, container,
false
);
或:
1.
View view = inflater.inflate(R.layout.fragment,
null
);
都会出错:<merge /> can be used only with a valid ViewGroup root and attachToRoot=true。
于是改成:
1.
View view = inflater.inflate(R.layout.fragment, container,
true
);
出错:The specified child already has a parent. You must call removeView() on the child's parent first。
结论:
1。inflater.inflate(R.layout.fragment, null)类似于inflater.inflate(R.layout.fragment, container, false);
2。inflater.inflate(R.layout.fragment, container, true)类似于inflater.inflate(R.layout.fragment, container)