【问题标题】:Is it possible to swap XML layouts during runtime in Android?是否可以在 Android 运行时交换 XML 布局?
【发布时间】:2010-07-27 15:08:44
【问题描述】:

是否可以在 onCreate() 中加载我的 main.xml 布局文件,然后在应用程序中切换到新的 XML 布局?我稍后尝试在应用程序中放置 setContentView() ,但这似乎并没有真正设置新视图,因为我对新设置的 xml 布局文件中对象的引用返回为空。我尝试使用 LayoutInflater 进行一些布局膨胀,但我没有运气(我可能做错了什么)...

那么还有其他方法可以在运行时交换布局 xml 布局吗? 谢谢!

【问题讨论】:

    标签: android xml layout


    【解决方案1】:

    您可以将布局放在一个 xml 文件中。不想立即看到的,在 XML 中设置 android:visibility="gone",然后在运行时调用 hiddenView.setVisibility(View.VISIBLE);

    您的 XML 将如下所示:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
        <LinearLayout android:id="@+id/layout1"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">
        </LinearLayout>
        <LinearLayout android:id="@+id/layout2"
            android:visibility="gone"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">
        </LinearLayout>
    </RelativeLayout>
    

    在运行时你可以这样做:

    layout1.setVisibility(View.GONE);
    layout2.setVisibility(View.VISIBLE);
    

    这实际上会创建布局交换的外观。

    我相信如果您在两个布局之间共享对象,这也会起作用。只需确保您首先使用android:id="@+id/view1" 设置id,然后对该id 的每个后续设置都使用android:id="@id/view1"(不带+)。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent">
        <LinearLayout android:id="@+id/layout1"
            android:layout_width="fill_parent">
            <View android:id="@+id/view1"/>
        </LinearLayout>
        <LinearLayout android:id="@+id/layout2"
            android:visibility="gone"
            android:layout_width="fill_parent" 
            android:layout_height="fill_parent">
             <View android:id="@id/view1"/>
        </LinearLayout>
    </RelativeLayout>
    

    【讨论】:

    • 我非常喜欢这个答案。我个人使用 ViewFlipper 来管理多个布局,这样我就不必管理进出范围的 [Resource] 变量,因为它们的布局设置为内容视图。这两种方法都是可行的。
    • 啊,我对 ViewFlipper 类没有经验。下次我需要做这样的事情时,我应该检查一下。
    【解决方案2】:

    你不能创建一个新的活动吗?否则,我认为您可能希望考虑从主容器中删除视图并通过代码重建您的 UI。如果我没记错的话,每个 Activity 只能调用一次 setContentView...

    【讨论】:

    • 嗨!不幸的是,我确实尝试了一项新活动,但我需要无缝过渡。看起来在加载新活动时,会涉及一些加载时间,这是我无法拥有的。
    • ps - 我相信你对 setContentView() 只允许调用一次是正确的。它不会引发异常,但是当我尝试使用 findViewById() 访问布局时,它会在尝试引用这些变量时给我一个空指针。
    • 确实,如果你想从 setContentView 外部访问视图,你应该遵循 EboMike 的建议。这样,您可以在充气器返回的视图上调用 findViewById。
    【解决方案3】:

    我也认为听起来你确实想要一个新活动,但我相信如果你手动删除现有视图然后调用getLayoutInflater().inflate(resourceId, rootViewGroup),你可以重新膨胀一些东西。

    【讨论】:

    • 感谢您的回答。下次遇到困难我会试试看!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    相关资源
    最近更新 更多