Android充气视图

时间:2011-12-12 14:09:02

标签: 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 个答案:

答案 0 :(得分:3)

我跟你一模一样。

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

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

在特定活动中,我使用以下内容填充onCreate方法中的每个布局:

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

事实上,我所有的XML布局都是活动的“部分”,我在运行时将其扩展为视图,我会在需要时动态添加到活动中。

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


如果你定位Android&gt; = Honeycomb(包括ICS)然后查看Fragment框架,它可能是一种更简单的方法来实现所有这些(还没有看过)

答案 1 :(得分:1)

答案不是太多,但我经常发现自己将布局本身分类。然后,在onFinishInlate()回调中,我使用findByViewId连接所有视图引用。在您的XML中,您可以将<RelativeLayout>替换为<com.company.CustomLayout>,假设您的CustomLayoutRelativeLayout的子类。

如上所述,您可以将它们拉出到单独的文件中,并将其包含在include标记中。这使重构变得容易,并允许您重用布局组件。

或者,如果您从代码中扩充这些子类布局,则不必担心活动中所有混乱的findViewById调用。

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

答案 2 :(得分:0)

我不确定您是否需要在“活动”中对所有这些视图进行充气。请考虑使用布局中的includemerge标记。这应该有助于您入门:http://developer.android.com/resources/articles/layout-tricks-merge.html

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

你还说过:“如果我只是夸大这些xml文件,那么我就无法访问里面的小部件,所以我无法从Java中设置我需要的功能。”

使用findViewById将任何布局组件添加到活动后,可以访问它,并将其返回的对象转换为相应的类型。