Android动态添加带有子视图的片段

时间:2013-01-15 11:40:57

标签: android android-fragments

我希望在添加片段之前以编程方式动态创建子视图列表。我有一个JSON文件,用一个视图列表设置每个片段,所以当我的应用程序启动时,有一个名为启动屏幕的活动,它只是在处理数据时显示图像。我下面的快速示例试图生成3个片段并设置其子视图(这是在启动画面活动中)

for(int i = 0; i < 3; i++)
        {
            DefaultFragment frag = new DefaultFragment();
            RelativeLayout layout = (RelativeLayout) createUI(frag);
            frag.setFragLayout(layout);
        }


private RelativeLayout createUI(final DefaultFragment frag_p) 
    {

        RelativeLayout layout = new RelativeLayout(this);
        RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT);

        Button but = new Button(this);
        but.setWidth(100);
        but.setHeight(100);
        but.setText("Next");

        but.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View arg0)
            {
                frag_p.testNextFragment();
            }
        });
        layoutParams.setMargins(100, 100, 0, 0);
        layout.addView((View) but, layoutParams);

        return layout;
    }

然后在片段中有一个名为fraglayout

的RelativeLayout
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState)
    {
//took out layout inflator temp, to try using the relativeLayout which was set from the splash screen
//      View V = inflater.inflate(R.layout.fraglayout, container, false);


        return fragLayout;
    }

这允许我将子视图添加到片段中,这个测试只涉及一个按钮,当按下时,会将您带到下一个工作正常的片段,但是当我尝试转到上一个片段时,我收到错误“指定的子项已经有父项“。

我知道这是因为这个

Button but = new Button(this);

它正在获取Splash Screen的上下文,而不是片段,但如何在片段创建之前从片段中获取上下文?

有人可以向我推荐一种更好的方法,在将子视图显示之前将其添加到片段中。

非常感谢任何帮助

  

01-15 12:25:01.598:E / AndroidRuntime(3443):致命异常:主要   01-15 12:25:01.598:E / AndroidRuntime(3443):   java.lang.IllegalStateException:指定的子节点已经有了   家长。您必须首先在孩子的父母上调用removeView()。 01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.view.ViewGroup.addViewInner(ViewGroup.java:1976)01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.view.ViewGroup.addView(ViewGroup.java:1871)01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.view.ViewGroup.addView(ViewGroup.java:1828)01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.view.ViewGroup.addView(ViewGroup.java:1808)01-15   12:25:01.598:E / AndroidRuntime(3443):at   com.single.DefaultFragment.onCreateView(DefaultFragment.java:61)01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)   01-15 12:25:01.598:E / AndroidRuntime(3443):at   android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)   01-15 12:25:01.598:E / AndroidRuntime(3443):at   android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)   01-15 12:25:01.598:E / AndroidRuntime(3443):at   android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)   01-15 12:25:01.598:E / AndroidRuntime(3443):at   android.support.v4.app.FragmentManagerImpl $ 1.run(FragmentManager.java:420)   01-15 12:25:01.598:E / AndroidRuntime(3443):at   android.os.Handler.handleCallback(Handler.java:587)01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.os.Handler.dispatchMessage(Handler.java:92)01-15   12:25:01.598:E / AndroidRuntime(3443):at   android.os.Looper.loop(Looper.java:123)01-15 12:25:01.598:   E / AndroidRuntime(3443):at   android.app.ActivityThread.main(ActivityThread.java:3683)01-15   12:25:01.598:E / AndroidRuntime(3443):at   java.lang.reflect.Method.invokeNative(Native Method)01-15   12:25:01.598:E / AndroidRuntime(3443):at   java.lang.reflect.Method.invoke(Method.java:507)01-15 12:25:01.598:   E / AndroidRuntime(3443):at   com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)   01-15 12:25:01.598:E / AndroidRuntime(3443):at   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)01-15   12:25:01.598:E / AndroidRuntime(3443):at   dalvik.system.NativeStart.main(原生方法)

1 个答案:

答案 0 :(得分:0)

想出解决方案,在我的片段中我有一个arraylist,它包含一个对象列表,每当我点击按钮转到下一个片段,或者返回按钮返回时,我调用删除所有相对布局的视图,并且现在它工作正常。