Android - Change fragment layout in runtime

前端 未结 2 1124
情歌与酒
情歌与酒 2021-02-04 15:22

I would like to implement a Single-Activity Multi-Fragments design in my app. I plan to have several \"screens\" (layouts of Fragment) that I\'ll switch between (possibly adding

相关标签:
2条回答
  • 2021-02-04 15:58
    this.loadFragment(AlarmExample.newInstance())
    this.loadFragment(XmlParsingFragment.newInstance())
    
    private fun loadFragment(fragment: Fragment) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, fragment)
            .commit()
    }
    

    In this way, you can set any fragment, based upon your requirement.

    0 讨论(0)
  • 2021-02-04 16:12

    It's certainly possible, the only thing you need to do is to generate your own IDs. The IDs may be anything but they must not conflict with the aapt IDs (the ones in R) and must not be negative.

    The following example demonstrates this with a set of fixed IDs:

    public class MainActivity extends Activity {
        private final int ID_TABLE = 0xA;
        private final int ID_ROW1 = 0xB;
        private final int ID_ROW2 = 0xC;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            LinearLayout ll = (LinearLayout) findViewById(R.id.root);
            TableLayout tl = new TableLayout(this);
            tl.setId(ID_TABLE);
            TableRow tr1 = new TableRow(this);
            tr1.setId(ID_ROW1);
            TableRow tr2 = new TableRow(this);
            tr2.setId(ID_ROW2);
            tl.addView(tr1);
            tl.addView(tr2);
            ll.addView(tl);
    
            MyFragment frag1 = new MyFragment();
            MyFragment frag2 = new MyFragment();
            MyFragment frag3 = new MyFragment();
            MyFragment frag4 = new MyFragment();
    
            getFragmentManager().beginTransaction()
                .add(ID_ROW1, frag1, "cell1_1")
                .add(ID_ROW1, frag2, "cell1_2")
                .add(ID_ROW2, frag3, "cell2_1")
                .add(ID_ROW2, frag4, "cell2_2")
                .commit();
            getFragmentManager().executePendingTransactions();
        }
    }
    

    In order to switch to a different layout, you can remove the fragments and add them elsewhere.
    Let me know how it goes.

    EDIT: to clarify, Views and ViewGroups don't need to be instantiated once and then kept for the lifetime of the Activity. Just make sure any fragments are either removed or detached before removing their associated view. Also, if you create and remove views outside of onCreate you should make sure it can be restored by using onSaveInstanceState and repeating the process in onCreate. Read the diagram here and the paragraph about configuration changes.

    0 讨论(0)
提交回复
热议问题