小编典典

如何使用以编程方式创建的内容视图将片段添加到 Activity

all

我想向以编程方式实现其布局的 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()的不正确。这样做的正确方法是什么?


阅读 66

收藏
2022-05-18

共1个答案

小编典典

事实证明,该代码存在不止一个问题。片段不能以这种方式声明,在与活动相同的 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;
        }
    }
}
2022-05-18