重新创建片段布局

Posted

技术标签:

【中文标题】重新创建片段布局【英文标题】:ReCreate Fragment layout 【发布时间】:2014-07-14 21:21:18 【问题描述】:

我有操作栏选项卡,当单击选项卡时,我想向我的片段添加新按钮。

这是我添加按钮的片段代码:

    Button btn;
    View myView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        int numberOfButtons= getArguments().getInt("someInt",0);
        LinearLayout view =  new LinearLayout(getActivity());
        // Inflate the layout for this fragment
        view.setOrientation(LinearLayout.VERTICAL);
        view.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        for (int i = 0;i<numberOfButtons;i++)
        
            btn = new Button(getActivity());
            view.addView(new Button(getActivity()));
        
        myView = view;
        return myView;
    

这是我向片段发送按钮数量的 MainActivity 代码:

int numberOfButtons=0;
    public static FragmentA newInstance(int someInt) 

        FragmentA myFragment = new FragmentA();
        Bundle args = new Bundle();
        args.putInt("someInt", someInt);
        myFragment.setArguments(args);
        return myFragment;
    

    @Override
    protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ActionBar  actionBar = getActionBar();
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        for (int i=0;i<10;i++)
        
            ActionBar.Tab tab = actionBar.newTab().setText("Tab"+i).setTabListener(new ActionBar.TabListener() 
                @Override
                public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) 

                    String tabText = (String)tab.getText();
                    String asd = (String)(tabText.substring(3,tabText.length()));
                    numberOfButtons = Integer.parseInt(asd);
                    FragmentA fragmentA = newInstance(numberOfButtons);
                    FragmentManager manager = getFragmentManager();
                    FragmentTransaction transaction = manager.beginTransaction();
                    transaction.add(R.id.mainLayout,fragmentA,"fragA");
                    transaction.commit();
                

                @Override
                public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) 

                

                @Override
                public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) 

                
            );
            actionBar.addTab(tab);
        
    

这段代码添加了按钮,但这里有一个问题。单击 Tab1 时,会向片段添加一个按钮。单击 Tab2 时,会在片段中添加两个按钮,但不会删除 Tab1 添加的第一个按钮。其中一个新按钮位于其上。

有没有办法在添加新的之前重置片段布局或删除片段的旧项目?

【问题讨论】:

【参考方案1】:

从您的代码看来,您只是将片段的实例叠加在一起。 Tab1添加的按钮没有被移除,因为Tab1还在后台...

尝试使用transaction.remove() 方法删除之前的片段,然后再调用transaction.add() 添加新片段...

还有transaction.replace() 方法可以同时执行这两个操作。或许也值得一试。

【讨论】:

我已经尝试过 transaction.remove() 但它没有奏效。 transaction.replace() 有效,但您说“它并不总是有效”:/ 这是什么意思? 我的立场是正确的,我说它并不总是有效,因为这个家伙的帖子:***.com/questions/6250580/… 但是再次阅读后 - 事实证明他正在尝试添加已经添加的片段,而不是创建他正在添加的片段的新实例(就像您正在做的那样,这是正确的方法)。我编辑了我的答案:) 这里还有一个问题。在使用transaction.Replace() 时,旋转屏幕会使应用程序崩溃。 :// 应用程序崩溃?有什么例外? LogCat 通常在这些情况下很有帮助。您可以查看导致应用程序崩溃的代码行、崩溃的原因(异常类型)等...尝试发布单独的问题,或在此处查找类似的问题...很有可能发生这种情况以前发生在某人身上。 感谢您的建议。我找到了解决方案,但它导致了一个新问题 :) 我正在继续搜索 :) 再次感谢您。

以上是关于重新创建片段布局的主要内容,如果未能解决你的问题,请参考以下文章

FragmentStatePageAdapter 缓存,重新创​​建活动后如何引用旧片段? (对于前 - 横向模式)

我想从片段中隐藏片段容器视图(在 MainActivity 布局内),但是当我单击任务按钮然后重新打开应用程序时它不起作用

恢复片段而不重新创建?

OnDetach/onAttach 片段重新创建片段活动

Jetpack Navigation Drawer 总是重新创建片段

重新创建活动后片段不可见