如何在一些Android应用和ICS中看到创建帮助覆盖?

时间:2012-04-18 19:52:14

标签: android

我想创建帮助叠加层,就像你第一次加载ICS时看到的那样,或者在ES File Explorer或Apex Launcher等应用程序中加载(有更多,但我现在想不到它们)。这只是一个相对布局,一个视图位于另一个视图的顶部吗?我无法找到任何用于执行此类操作的示例代码。任何人都知道这是如何完成或有任何想法?

ES File Explorer ES File Explorer

4 个答案:

答案 0 :(得分:83)

我们假设您通常会拨打setContentView(R.layout.main),但在首次运行时,您希望使用此叠加层。

步骤1:在Java代码中创建FrameLayout并将其传递给setContentView()

步骤2:使用LayoutInflaterR.layout.main充气到FrameLayout

步骤3:使用LayoutInflater将叠加层扩展为FrameLayout

步骤4:当用户点按按钮(或其他)以关闭叠加层时,请致电removeView()以从FrameLayout移除叠加层。

由于叠加层是FrameLayout的后续子层,因此它会浮动在R.layout.main的内容之上。

答案 1 :(得分:80)

在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>

答案 2 :(得分:4)

你可以很快地做到这一点。例如,您添加了一个LinearLayout,您可以在其中放置与您的帮助信息相对应的alpha图片以及您想要像叠加层一样绘制的内容。在您的xml活动中,在具有Gone可见性的活动布局之后,将此布局放在RelativeLayout中。当您想要绘制帮助信息时,您只需要将此可见性设置为可见。

我希望,我很清楚,如果您有任何疑问,我很乐意回答。

答案 3 :(得分:1)

请参阅我的另一个答案,如何以编程方式在当前活动之上显示叠加层布局。 Activity的layout.xml不需要了解覆盖皮肤的任何信息。您可以将叠加半透明,仅覆盖屏幕的一部分,一个或多个textview和按钮... How to overlay a button programmically?

  • 创建res / layout / paused.xml RelativeLayout模板或使用任何布局toplevel
  • 创建一个显示叠加外观的功能
  • 键是获取layout.xml的句柄,使用LayoutInflater类来解析xml以查看对象,将叠加视图添加到当前布局结构
  • 我的示例使用计时器通过将覆盖对象从视图结构中完全删除来销毁覆盖对象。这可能是你想要的,也可以毫无痕迹地摆脱它。

我的目标是主要活动不知道任何覆盖皮肤,覆盖来来去去,许多不同的叠加,仍然能够使用overlay1.xml文本文件作为模板,内容应该以编程方式更新。我几乎完成了CommonsWare告诉我们的内容,我的帖子显示了实际开始的程序代码。

免责声明:OP“感谢您的意见。这就是我想象的完成情况。我必须对下面的答案给予肯定”评论并不代表我的答案,而是CommonsWare的回答。 Stackoverflow改变了后期订单。