今天学习android fragments时,遇到一个运行时错误
The specified child already has a parent. You must call removeView() on the child's parent first.
源码如下:MainActivity.java 目的是根据屏幕尺寸的变化加载不同的fragment
public class MainActivity extends Activity {
@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getRealMetrics(outMetrics);
if(outMetrics.widthPixels > outMetrics.heightPixels){
Fragment1 fragment1 = new Fragment1();
getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment1).commit();
}else{
Fragment2 fragment2 = new Fragment2();
getFragmentManager().beginTransaction().replace(R.id.main_layout, fragment2).commit();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Fragment1.java
@SuppressLint("NewApi")
public class Fragment1 extends Fragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment1, container);
}
}
Fragment2.java@SuppressLint("NewApi")
public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.fragment2, container);
}
}
问题的原因在于Fragment在inflate的时候指定了container,在将其嵌套到其他的activity中的时候就报此错误,所以应将
inflater.inflate(R.layout.fragment2, container);
改为
return inflater.inflate(R.layout.fragment2, null);不能给它指定父控件,问题解决
</pre><pre name="code" class="java">