在另一个活动上叠加活动,或在另一个视图上叠加视图

28

我有两个类,FirstActivity和SecondActivity。

第一个活动

Intent intent=new Intent(getApplicationContext(),SecondActivity.class);
startActivity(intent);

SecondActivity能够覆盖在FirstActivity之上吗?即,将FirstActivity变暗,将SecondActivity显示在其上方。

如果2个不同的activity无法实现这一点,那么在同一个activity中是否可以对2个视图进行覆盖呢?我希望使用dialog不是唯一的选择。

4个回答

27

是的,我知道对话框是一种选择,但还有更好的方法吗?就用户界面而言,它看起来不太好看。 - newbie
当然,如果您愿意,可以为内容创建视图并调整透明度。我不太确定您的意图是什么,通常情况下,第一个活动(FirstActivity)将完全不可见,因为第二个活动(SecondActivity)将覆盖屏幕? - Alan Moore
您可以随时创建自定义对话框... 一个Activity代表一个带有用户界面的单个屏幕。例如,电子邮件应用程序可能有一个显示新邮件列表的Activity,另一个用于撰写电子邮件的Activity,以及另一个用于阅读电子邮件的Activity。虽然这些Activity在电子邮件应用程序中共同工作以形成一个协调的用户体验,但每个Activity都是独立的。因此,不同的应用程序可以启动其中任何一个Activity(如果电子邮件应用程序允许)。 - JPM
1
此外,如果您不喜欢对话框的主题,您可以随时创建自己的主题。 - Alan Moore
我想这是最好的答案。似乎没有比创建自定义对话框更好的方法了。 - newbie
显示剩余2条评论

25

如果你不想使用对话框,可以使用相对布局叠加视图。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout android:id="@+id/content"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView android:id="@+id/text"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:text="some content"
            android:textSize="70dp"/>
    </LinearLayout>

    <LinearLayout android:id="@+id/overlay"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#99000000"
            android:clickable="true"
        android:visibility="gone">
        <EditText android:id="@+id/edittext"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_margin="50dp" />
    </LinearLayout>

</RelativeLayout>

第一个LinearLayout(id/content)是您的基础布局,您的正常内容将放置在其中。

第二个LinearLayout(id/overlay)是您的覆盖布局,您希望它显示在基础布局的顶部。背景颜色将为您提供淡化的背景,您可以在该布局中添加任何您想要的内容来制作覆盖层。要显示覆盖层,只需将其可见性从gone更改为visible即可。


第一个线性布局中的按钮等是否在覆盖布局可见后仍然完全可用? - newbie
4
如果您不想让背景可点击,您可以使遮罩 LinearLayout 可点击。这样可以捕获所有的点击事件并防止它们穿透到背景上,同时遮罩层是可见的。当您将遮罩层的可见性设置为“gone”时,内容层的可点击性将被恢复。我更新了代码示例以展示这一点。 - ImR
你的解决方案对我来说非常有效。我只想说,如果你想测试更多的背景颜色(透明度代码),你可以看看这个好答案:https://dev59.com/52gu5IYBdhLWcg3wfHE_#16890937 - Filipe Brito

7
在清单文件中像这样声明第二个活动。android:theme="@android:style/Theme.Dialog"。然后只需从您的代码中调用第二个活动即可。
 <activity
                android:name=".FirstActivity"
                android:label="@string/title_activity_first" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".SecondActivity"
                android:label="@string/title_activity_second" 
                android:theme="@android:style/Theme.Dialog"
                >
                <intent-filter>
                    <action android:name="transparent.text.SECONDACTIVITY"/>
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </activity>

第二个Activity的xml文件。你可以按照自己的意愿设计,但是为了参考,我已经发布了这个。关键概念在于清单文件(即)如何在清单中定义你的第二个Activity。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="192dp"
            android:background="#aabbcc"
            android:text="Sybrant has provided Takoma with a great team which helped us from the beginning to the final stage of our product, to our fullest satisfaction. We have been able to deliver a high quality of eLearning products to our corporate customers like Nissan with Sybrant’s support”"
            tools:context=".FirstActivity" />
    
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/textView1"
            android:layout_alignParentLeft="true"
            android:layout_marginBottom="43dp"
            android:layout_marginLeft="80dp"
            android:text="Button" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@+id/button1"
            android:layout_below="@+id/textView1"
            android:layout_marginRight="42dp"
            android:layout_marginTop="80dp"
            android:text="TextView" />
    
    </RelativeLayout>

-17

1-截取第一个活动的屏幕截图。

2-(可选)将屏幕截图变暗、着色或模糊。

3-然后调用第二个活动,并将第一个活动的屏幕截图作为第二个活动的背景。


20
很严厉,但我笑了。 - Maxime Tremblay-Savard
3
在游戏中,当你想要打开一个背景部分可见的全屏菜单时,这实际上是一种非常好的策略...节省了大量绘制调用! - 5argon
1
@5argon 这真的取决于你的游戏长什么样子。但是,如果你要在移动应用程序中完成它?你仍然需要将该图像存储在某个地方,可能是内存中?你如何处理方向更改?你会拍两张截图吗?总的来说,我认为有比截屏更好的处理这些情况的方法。 - Jiri Kralovec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接