我想向以编程方式实现其布局的 Activity 添加一个片段。我查看了 Fragment 文档,但没有很多示例描述我需要什么。这是我尝试编写的代码类型:
public class DebugExampleTwo extends Activity { private ExampleTwoFragment mFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout frame = new FrameLayout(this); if (savedInstanceState == null) { mFragment = new ExampleTwoFragment(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(frame.getId(), mFragment).commit(); } setContentView(frame); } }
…
public class ExampleTwoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Button button = new Button(getActivity()); button.setText("Hello There"); return button; } }
此代码编译但在开始时崩溃,可能是因为我FragmentTransaction.add()的不正确。这样做的正确方法是什么?
FragmentTransaction.add()
事实证明,该代码存在不止一个问题。片段不能以这种方式声明,在与活动相同的 java 文件中,但不是作为公共内部类。框架期望片段的构造函数(没有参数)是公开的和可见的。将片段作为内部类移动到 Activity 中,或者为片段创建一个新的 java 文件来解决这个问题。
第二个问题是,当您以这种方式添加片段时,您必须传递对片段包含视图的引用,并且该视图必须具有自定义 ID。使用默认 id 会使应用程序崩溃。这是更新的代码:
public class DebugExampleTwo extends Activity { private static final int CONTENT_VIEW_ID = 10101010; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); FrameLayout frame = new FrameLayout(this); frame.setId(CONTENT_VIEW_ID); setContentView(frame, new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); if (savedInstanceState == null) { Fragment newFragment = new DebugExampleTwoFragment(); FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.add(CONTENT_VIEW_ID, newFragment).commit(); } } public static class DebugExampleTwoFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { EditText v = new EditText(getActivity()); v.setText("Hello Fragment!"); return v; } } }