我开始尝试使用刚刚于3月3日发布的Android兼容性软件包向基于2.1的Android应用添加片段.我将库包含到我的项目中,并开始将代码从基于Activity的类移动到基于Fragment的类,但我注意到Google的Fragment示例似乎依赖于3.0中的Activity类(Honeycomb)有新方法getFragmentManager().它似乎是Fragment系统的一个完整的钩子.
我试图在兼容包库中查看一些包含getFragmentManager()的Activity实现,但我找不到它.有谁知道我在哪里可以找到getFragmentManager()所以我可以包含Fragments for Honeycomb兼容性,或者如果不是,你知道如何在不使用FragmentManager的情况下包含片段吗?
我需要替换Fragment一个Activity与另一个Fragment,下面是层文件Activity:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/home_layout_container">
<fragment android:name="com.foo.FragA"
android:id="@+id/home_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
所以默认情况下有FragA,现在我想在活动中用FragB替换它,我做了:
public void onRegionClicked(Region region) {
RegionInfoFragment rif = RegionInfoFragment.newInstance(region);
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.home_list, rif);
}
Run Code Online (Sandbox Code Playgroud)
但我得到了例外:
>6:24:40.685: ERROR/AndroidRuntime(9194): Uncaught handler: thread main exiting due to uncaught exception
05-06 16:24:40.692: ERROR/AndroidRuntime(9194): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
05-06 16:24:40.692: ERROR/AndroidRuntime(9194): …Run Code Online (Sandbox Code Playgroud) 我花了一些时间把头包裹在碎片上,但这应该是我关于碎片的最后一个问题,因为我认为我只是让它们失效了.我知道这是一堆乱七八糟的代码.但我很感激帮助,以确保我没有破坏任何碎片的基本规则.
我将发布我的所有代码,看看是否有人可以"查看它",看看我是否犯了重大错误,或者我是否应该采用更简单的方法.最后,正如标题中所述,我的片段没有被替换......它被添加到顶部.
文件树:

MainActivity.java:
package com.example.learn.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
public class MainActivity extends FragmentActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
/* Add a class to handle fragment */
public static class SSFFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout …Run Code Online (Sandbox Code Playgroud) 当我运行我的应用程序时,MainFragment根本没有显示在扩展ActionBarActivity的活动中.我确实查过这篇文章,但它没有帮我解决我的问题.这是我的活动和片段:
activity_main.xml中:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
}
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// …Run Code Online (Sandbox Code Playgroud) 这是我的主要内容:
package com.example.frags;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
public class NewMessage extends FragmentActivity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.new_message);
//Set new fragment
FragA fragA = new FragA();
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.add(R.id.container_id, fragA);
transaction.commit();
}
}
Run Code Online (Sandbox Code Playgroud)
我的FragA课程:
package com.example.frags;
import android.os.Bundle;
import android.text.style.SuperscriptSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FragA extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { …Run Code Online (Sandbox Code Playgroud)