2011-10-23 47 views
8

我想在我的应用程序中实现单活动多碎片设计。我打算在代码中有几个“屏幕”(片段布局),我将在它们之间切换(可能会添加到后端堆栈)。Android - 在运行时更改片段布局

根据我的理解,使用布局对象(例如FrameLayout)设置每个屏幕中片段的布局,布局对象充当片段的占位符(共享相同的ID)。由于不同的屏幕有不同的片段排列(可以是FrameLayout和另一个LinearLayout等),我想知道:如何在运行时切换片段布局?

我明白添加/替换碎片(通过FragmentManager),但我想完整地添加一个新的布局,其中包含他们,在一个现场活动。有点像“setContentView”交易...

我该怎么做? 谢谢!丹尼。

+0

我在这里发布了单活动多碎片代码:http://stackoverflow.com/questions/7797389/how-avoid-re-initializing-activity-that-takes-a-long-time-to-initilize/ 7799391#7799391 – user999717

+0

感谢您的快速响应。不过,我认为在像你的例子一样的布局中切换片段('R.id.mainframe'),并不能解决我的问题,即如何在片段布局之间切换。特别是如果布局是在代码中创建的(在调用onContentView之后),就像我的情况一样。 – DannyA

+0

哦,我明白了,所以你想重新存在现有的片段而不需要重新实例化它们?那很有意思。 – user999717

回答

4

这当然是可能的,你唯一需要做的就是生成你自己的ID。这些ID可以是任何东西,但它们不能与aapt ID(R中的那些ID)冲突,并且不能是负面的。

下面的例子说明了这一点与一组固定ID的:

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(); 
    } 
} 

为了切换到不同的布局,可以除去碎片,并将其添加其它地方。
让我知道它是怎么回事。

编辑:澄清,视图和ViewGroups不需要实例化一次,然后保持活动的一生。只要确保在删除相关视图之前删除或分离了任何碎片。另外,如果您在onCreate之外创建和删除视图,则应确保可以使用onSaveInstanceState并在onCreate中重复该过程来恢复视图。阅读diagram here和关于configuration changes的段落。

+0

感谢您的努力!由于我是Android新手,我想确保自己正确理解你 - 可以在代码中的任何位置从我的活动的主视图中添加/删除视图和布局,而不仅仅是在onCreate(I不要以为我见过这方面的例子),然后在飞行中为它们创建并添加片段?这不仅仅是“删除碎片并将它们添加到其他地方”,因为我为它们创建了一个新的布局。 – DannyA

+0

目标是最终将这个片段逻辑分离到不同的“屏幕”类,并让每个类都知道它自己的布局ID,并将它自己的片段放入其中。然后我可以通过片段交易从一个“屏幕”导航到另一个“屏幕”。例如隐藏前一个屏幕的所有片段,然后显示新的片段。我必须承认,这种技术看起来有点奇怪,因为它会用空白的布局和不可见的碎片淹没我的活动......看起来我的目标是合理的,但我还没有找到正确的设计。 – DannyA

+0

那么这是一个有趣的思路,但是这不是什么活动和他们的startActivity(意图)方法是为什么?您也可以免费获得按钮功能。 – user999717