2011-12-12 120 views
1

很难尝试和说出这个问题,但我会尽我所能。Android膨胀视图

基本上,我有一个应用程序,我想分开代码更多。试图解释这一点,会给我一个屏幕的例子。

在我的主屏幕中,我有一个标题,用户详细信息,余额,下一个帐单详细信息和使用详细信息。我想将这些部分分成各自的视图。因此,我在我的主XML文件是我有5个不同的RelativeLayouts,这样

<RelativeLayout android:orientation="vertical" 
    android:layout_below="@+id/title" android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:id="@+id/layout1"> 


</RelativeLayout> 

一个,因为我希望有我的主屏幕上的各项功能。正如你所看到的,我也将每个布局设置在以前的布局下面,所以顺序是title,layout1,layout2,layout3,layout4。 (我这样做的原因是,我希望每个布局是可互换的,即我可以删除layout2,然后命令title,layout1,layout3,layout4,因为我可能不需要第二个布局,取决于所需的应用程序)

所以在我的主要活动类中,我调用了这些布局中的每一个。

layoutTitle = (RelativeLayout) findViewById(R.id.title); 
    layout1 = (RelativeLayout) findViewById(R.id.layout1); 
    layout2 = (RelativeLayout) findViewById(R.id.layout2); 
    layout3 = (RelativeLayout) findViewById(R.id.layout3); 
    layout4 = (RelativeLayout) findViewById(R.id.layout4); 

然后我用布局充气像这样

View view; 
    LayoutInflater inflater = (LayoutInflater) getBaseContext() 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    view = inflater.inflate(R.layout.userdata, null); 

设置为我在XML文件中定义每个布局的布局。

我想知道的是,是否可以膨胀另一个活动而不是XML文件?我问这个问题的原因是,我说主屏幕的每个功能都是由标题,用户详细信息,平衡等组成的,我为每个功能都有一个活动。这些函数中的每一个都具有我设计的自定义功能,比如动画等。如果我简单地膨胀这些xml文件,那么我不能访问里面的小部件,所以我不能从Java设置功能,这是我需要的。

如果我能够膨胀另一个活动,那么这不会是一个问题,因为我会为活动中的每个函数设置功能,然后只是夸大该类。

我希望我的问题很清楚,如果不是我可以在任何你不确定的地方展开。

将非常感谢您的任何帮助!

编辑:如果它是不可能膨胀一个类,那么是否有任何其他方式的方法,你可以建议,可以解决我的问题?

回答

3

我做的和你完全一样。

我在我的Java活动中使用组合来实现跨我的活动共享功能。我认为活动是“上下文”,而不是我的页面中复制的部分。因此,当我处于某个上下文(一个活动)时,我会显示具有特定参数的layout1,layout2和layout3以及依赖于该活动的特定内容。在另一项活动中,布局1,2或3可能会有所不同,但它们始终在我的屏幕上具有相同的位置。

我使用通过视图构图:我所有的活动都有一个超类(可以称之为任何你想要的东西,比如ActivityWithCustomLayout,它包含我所有的布局作为类成员(如ViewGroup)。它们受到保护,所以变量layout1,layout2layout3可用于此超类的所有子类活动。

当在特定的活动,我填充每个布局上我onCreate法:

layout1.addView(...something inflated from an XML that depends on that specific activity...); 
layout2.addView(...same principle...); 

所以其实我所有的XML布局是活动的“零件”,这是我吹在运行时进入视图,即在需要时动态添加到我的活动中。

你说的对,这些解释都是不容易的:)


如果定位到Android> =蜂窝(包括ICS),然后看看在Fragment框架,它可能是一个更简单的方法实现所有这些(还没有看过)。

+1

+1对于片段建议。通过添加兼容性库,您可以使用1.6或更高版本的Fragments:http://developer.android.com/sdk/compatibility-library.html – elevine

+0

是的,我知道,我真的需要研究Fragment框架,这可能会使我的应用程序更易于管理和重构。好吧。 – Guillaume

+0

Fragments +1。似乎是这个问题的理想选择。 – kaspermoerch

0

我不确定是否需要在活动内充实所有这些视图。请在Layout中使用includemerge标签。这应该有助于你开始:http://developer.android.com/resources/articles/layout-tricks-merge.html

你也可以切换布局的可见性。因此,您可以用XML声明它们,将它们初始化为visibility="false",然后在Java代码中切换该可见性。

你也声明:“如果我只是夸大这些XML文件,那么我不能访问里面的小部件,所以我不能从Java设置功能,这是我需要的。”

您可以使用findViewById将任何布局组件添加到活动中,然后将其转换为适当类型的对象。

1

没有太多的答案,但我经常发现自己继承自己的布局。然后,在onFinishInlate()回调中,我使用findByViewId连接了所有视图引用。在你的XML中,你可以用<com.company.CustomLayout>代替<RelativeLayout>,假设你的CustomLayoutRelativeLayout的子类。

如前所述,您可以将它们拖出到单独的文件中,并使用include标签包含它们。这使得重构变得容易,并允许您重用布局组件。或者,如果您从代码中夸大这些子类别布局,则不必担心您的活动中所有混乱的findViewById调用。

片段也很棒,并且具有与活动类似的生命周期。祝你好运!