2011-11-27 70 views
3

正如我其实不是很自信编程改变意见,我有以下问题:如何使用LayoutInflater/ViewStub用于覆盖

在我的应用程序的第一个开始,我希望有主的覆盖屏幕,它告诉用户查看设置,因为用户必须配置两个关键选项。我不想使用AlertDialog,而不使用向导。所以,我决定采取类似于Go SMS的方法,并在第一次启动时创建覆盖。我创建的实体模型看起来是这样的:

普通菜单: Normal

先启动: enter image description here

因此,这些都是问题,我有:

  1. 就像我说的,我不不想在首次启动时使用重叠的屏幕截图,因为这会占用太多空间,并且不会独立于语言和屏幕。
  2. 我会圆为PNG,但我不知道究竟是如何把它放在图像
  3. 与文本同样的问题
  4. 最后我想提出在一个半透明的白色应用程序。它不一定需要图标的孔,但它会很好。

如果你需要的布局源,你可以在pastebin

所以得到它,我只需要在这里得到一个开始,如果它是更好地使用LayoutInflater或ViewStub以及如何去实现它,因为我绝对没有经验...

谢谢!

/编辑:我上传了一个新的,布局更合理的布局。

回答

1

我遇到过类似的问题,我的客户想要一个应用程序的漫游,整个屏幕必须变得更白(如他们所说:“透明”),除了按钮被解释一个重叠的讲话泡泡。
幸运的是,您的布局并不像我不得不使用的那样复杂:)

现在,您可以通过两种方式获得透明效果,可以有白色背景并调用所有视图setAlpha()方法,或者你可以创建一个半透明的白色覆盖。
如果您使用叠加层,则必须找到一种方法来显示叠加层中的不透明按钮。这可能会有点复杂。 如果使用第一个选项,您可以在不透明视图上设置Alpha(1)以使其显示出来。

setAlpha()方法仅适用于api版本11+,因此如果您定位的是早期版本,则可能需要稍微更复杂一些。在视图上设置阿尔法预蜂窝
例子:

布局的按钮(让他们不过你想要的,只是让他们相似的,所以你可以通过它们循环):

<LinearLayout 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <ImageView 
     android:tag="image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/tile"/> 
    <TextView 
     android:tag="text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#FF000000" 
     android:text="button1"/> 
</LinearLayout> 

在你程序,当你想使按钮透明:

LinearLayout l = (LinearLayout) findViewById(R.id.button1); 
((ImageView)l.findViewWithTag("image")).setAlpha(0x7F); 
((TextView)l.findViewWithTag("text")).setTextColor(0x7F000000); 



当你^ h ave决定如何创建透明度效果,您将不得不决定如何显示叠加文本/泡泡。您很可能希望将其放在整个布局顶部的单独图层中,以确保它不受新视图的影响。
实现此目的的一种方法是将您的根布局元素更改为FrameLayout,然后在此创建/显示。 e.g:

​​

当显示的介绍,您可以设置隐藏的叠加视图表项目的位置的位置加以解释,文本更改为适当的串/资源并显示视图。

当介绍结束时,您重置所有按钮的alpha值,并将覆盖层的可见性设置为再次消失。

+0

非常感谢您的回答!但是,我以某种方式没有得到代码的工作。你可以提供一些示例代码? (你不必为我写整个东西) – Force

+0

我添加了一些代码来改变按钮的透明度,因为我意识到setAlpha()只存在于蜂窝中。我会随时更新一些示例代码。 – Jave

+0

谢谢,现在它工作完美! :) – Force

0

由于我没有太多的ViewStub经验,我会用LayoutInflater来做。

首先,您需要在当前布局的顶部加载第二个布局。最简单的方法是创建一个FrameLayout,它将当前的视图作为一个孩子,并且在第一次启动时动态地加载第二个孩子。当你在一个Activity中加载一个内容视图时,它将被附加到一些已经创建的视图(一些DecorView,一个FrameLayout等等)。因此,您可以重新使用现有的FrameLayout,也可以创建一个新的FrameLayout。 我会为第二个解决方案投票,因为它更稳定(我只是提到了其他可能性,以防止您想要最小化层数)。因此,作为第一步,将当前布局包装在FrameLayout中,并为其指定一个ID,比如说“@ id/root”。

然后,在onCreate方法,你可以有这样的事情:

setContentView(R.layout.main); 
if (isFirstRun()) { 
    ViewGroup parent = (ViewGroup)findViewById(R.id.root); // locate the FrameLayout 
    LayoutInflater li = LayoutInflater.from(this); // get an instance of LayoutInflater 
    li.inflate(R.layout.overlay, parent); 
} 

到目前为止,您将有覆盖加载。现在由您来定义覆盖层。 为了增强美白效果,只需在叠加层的根视图上设置以下属性即可。xml布局:

android:background="#40ffffff" 

要定位圆,首先您需要找到它的位置。您可以使用View.getLocationOnScreen获取屏幕上图标的绝对坐标(圆圈下方)。然后,你可以有两种选择:

  • 可以创建一个自定义视图(覆盖)和手动绘制圆在给定位置
  • 或使用的ImageView加圈,并据此调整左侧和顶部边缘在坐标上
+0

感谢您的回答,但是我没有得到LayoutInflater部分的工作。无论我做什么或我使用什么布局,它只是不显示任何东西... – Force

+0

你可以尝试从其他答案(即在默认布局中包含覆盖布局,但默认情况下隐藏)或使用hierarchyviewer来重新检查层次结构(可能是因为某种原因添加了,但不可见) –

+0

我将在其他答案上工作 - 但是我真的很喜欢让这个工作。因为,LayoutInflater一定有问题,我也尝试过'LayoutInflater li =(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);',但是这也行不通... – Force