不能将片段添加到活动

问题描述:

我试图以编程方式将Fragment添加到ScrollView,它具有LinearLayout。出于某种原因,当我调用以下函数时,它似乎没有向LinearLayout添加任何元素。不能将片段添加到活动

下面是代码: 当用户点击一个按钮,下面的代码被称为是应该的片段添加到的LinearLayout

这个函数调用下面的函数,每类ArrayList中:

private void addCourse(Course c) { 
    LinearLayout destination = (LinearLayout) findViewById(R.id.addListCourses); 
    FrameLayout fl = new FrameLayout(this); 
    CreateFragTests frag = new CreateFragTests(); 
    fl.setId(frag.getId()); 
    fl.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT)); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.add(fl.getId(), frag).commit(); 
    destination.addView(fl); 
    //frag.setCourse(c); 
} 

片段本身是在这里:

public class CreateFragTests extends Fragment { 

private static int uniqID = 0; 
private static String uniqPrefix = "courseList"; 
private Course course; 

public CreateFragTests() { 
    super(); 
    uniqID++; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    //After some debugging, I have found that container is passed as null to this 
    //this function which may be part of the problem? 
    return inflater.inflate(R.layout.activity_create_frag_tests, container, true); 
} 

public void setCourse(Course c) { 
    this.course = c; 
    setCourseName(course.name); 
    setInstructorsName(course.instructorLastName+", "+course.instructorFirstName); 
} 

public String getUniqID() { 
    return uniqPrefix+"_"+uniqID; 
} 
} 

经过一些调试后,我发现当onCreateView()被调用时,它会收到容器的空值。我有我的模拟代码在这里给出的例子后:How do I add a Fragment to an Activity with a programmatically created content view这里:http://developer.android.com/training/basics/fragments/fragment-ui.html

编辑:另外,如果我使用相同的代码,但尝试添加一个TextView,而不是只是正常工作的一个片段。

问题出在这里fl.setId(frag.getId());。而不是传递frag.getId()作为它的id,你应该传入一个唯一的id。

有2种方法,你可以做,无论是在XML或类 定义ID例如

private static final int CONTAINER_ID = 123456;

并用它来设置的FrameLayout ID。

fl.setId(CONTAINER_ID);

或者更简单的方法将是如下

private void addCourse(Course c) { 
    CreateFragTests frag = new CreateFragTests(); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.add(R.id.addListCourses, frag).commit(); 
    //frag.setCourse(c); 
}