Answers:
假设您通常会调用setContentView(R.layout.main),但是在第一次运行时,您希望具有此覆盖。
步骤#1:创建一个FrameLayoutJava代码并将其传递给setContentView()。
第2步:使用LayoutInflater膨胀R.layout.main成FrameLayout。
步骤#3:用于LayoutInflater将叠加层充气到中FrameLayout。
步骤#4:当用户点击按钮(或其他按钮)以关闭叠加层时,请致电removeView()从中删除叠加层FrameLayout。
由于叠加层是的后继子层FrameLayout,因此它将浮动在内容的顶部R.layout.main。
ViewGroup“教练标记”层的自定义可以处理该问题,并且有一些库(例如ShowcaseView)提供了该模式的固定实现。
在UX对话中,“教练标记”是“帮助叠加” :-)
coach_mark.xml是您的教练标记布局
coach_mark_master_view是coach_mark.xml中最顶层视图(根)的ID
public void onCoachMark(){
final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.setContentView(R.layout.coach_mark);
dialog.setCanceledOnTouchOutside(true);
//for dismissing anywhere you touch
View masterView = dialog.findViewById(R.id.coach_mark_master_view);
masterView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialog.dismiss();
}
});
dialog.show();
}
添加coach_mark.xml的样本(到由Oded Breiner提供的出色解决方案中),因此ppl易于复制和粘贴以快速查看工作示例。
这里的coach_mark.xml样本,将-> drawable / coach_marks更改为您的图像:
coach_mark.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/coach_mark_master_view">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/coach_marks_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_gravity="center_horizontal"
android:src="@drawable/coach_marks" />
</RelativeLayout>
</LinearLayout>
并且可以选择使用此主题来删除填充:
<style name="WalkthroughTheme" parent="Theme.AppCompat">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:backgroundDimEnabled">false</item>
</style>
A dialog is a small window that prompts [...]. A dialog does not fill the screen and is normally used for modal events [...].。如果使用此代码,则会在屏幕的一小部分中压缩我的主视图。如果我设置了android:layout_width="640dp" android:layout_height="480dp"(即我正在测试的屏幕的实际值),则它可以正常工作。(当然,这不是可行的解决方案)
new Dialog(getContext(), R.style.WalkthroughTheme);
您可以很快完成。例如,您添加了LinearLayout,在其中放置了带有Alpha的图片,该图片与您的帮助信息以及要像覆盖层一样绘制的内容相对应。在您的活动xml中,将此活动放置在具有Gone可见性的活动布局之后,将该布局放入RelativeLayout中。当您想绘制帮助信息时,您只需要将此可见性设置为visible。
希望我很清楚,如果您有任何问题,请回答。
请参阅我的另一个答案,如何以编程方式在当前活动的顶部显示覆盖布局。活动的layout.xml不需要了解有关覆盖皮肤的任何信息。您可以将覆盖层设置为半透明,仅覆盖部分屏幕,一个或多个textview以及其上的按钮... 如何以编程方式覆盖按钮?
我的目标是主要活动不了解任何叠加层皮肤,叠加层来去去去,许多不同的叠加层,仍然能够使用overlay1.xml文本文件作为模板,并且应该以编程方式更新内容。我做了CommonsWare告诉我们的几乎所有事情,我的帖子显示了开始的实际程序代码。
免责声明:OPs:“谢谢您的输入。这是我想象的完成方式。我必须赞扬下面的答案”评论不是我的答案,而是CommonsWare的答案。Stackoverflow更改了后顺序。