用于透明PopupWindow布局的样式背景不起作用

时间:2012-06-25 12:28:33

标签: android android-layout

所以我有这个扩展PopupWindow的类。我将类的背景设置为@android:color/transparent,并使用以下布局作为其内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tips_root"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="8dip"
    android:orientation="horizontal"
    style="?Tips_Background" >

    <TextView
        android:id="@+id/textInfo"
        android:layout_width="0dip"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/register_termsandconditions" 
        style="?TextAppearance_Footer" />

    <ImageButton
        android:id="@+id/btnClose"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="0dip"
        android:layout_gravity="top|right"
        android:src="@drawable/btn_dialog_normal" 
        style="@style/App_ImageButtonStyle" />

</LinearLayout>

我的想法是获得一个像这样的弹出窗口:

My Custom Tips Window

我用来达到这种效果的风格如下:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
    android:visible="false">

    <gradient 
        android:startColor="@color/trademark_dark"
        android:endColor="@color/trademark_darkest"
        android:angle="90" />

    <stroke android:width="2dp" android:color="#AAAAAA" />
    <corners android:radius="10dp" />

    <padding 
        android:left="8dp" 
        android:top="8dp"
        android:right="8dp" 
        android:bottom="8dp" />

</shape>

事情按预期工作,除了在我的启动活动中,窗口看起来完全透明,好像背景根本没有效果。

My Transparent Tips Window

我使用以下内容将包含此样式的主题应用于整个应用程序:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    android:theme="@style/NI_AppTheme.Trademark"
    android:name="NApplication">
    <activity android:name="LoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
  ....

LoginActivity是我遇到此问题的唯一活动。我能错过什么?

更新

@imran khan概述的解决方案有效。但是,我需要通过主题属性而不是直接硬编码引用来引用此值,因为背景将随主题而变化。我试过了:

<style name="NI_AppTheme.Trademark">
    <item name="Tips_Background">@drawable/application_tips_trademark</item>
</style>

然后设置布局'android:background="?Tips_Background",但它会使用以下堆栈跟踪崩溃应用程序:

 06-25 21:09:36.518: E/AndroidRuntime(874): Caused by: android.content.res.Resources$NotFoundException: Resource is not a Drawable (color or path): TypedValue{t=0x2/d=0x7f01002e a=-1}
 06-25 21:09:36.518: E/AndroidRuntime(874):     at android.content.res.Resources.loadDrawable(Resources.java:1897)
 06-25 21:09:36.518: E/AndroidRuntime(874):     at android.content.res.TypedArray.getDrawable(TypedArray.java:601)
 06-25 21:09:36.518: E/AndroidRuntime(874):     at android.view.View.<init>(View.java:2785)
 06-25 21:09:36.518: E/AndroidRuntime(874):     at android.view.ViewGroup.<init>(ViewGroup.java:385)
 06-25 21:09:36.518: E/AndroidRuntime(874):     at android.widget.LinearLayout.<init>(LinearLayout.java:174)
 06-25 21:09:36.518: E/AndroidRuntime(874):     at android.widget.LinearLayout.<init>(LinearLayout.java:170)

3 个答案:

答案 0 :(得分:1)

活动是实际附加清单中定义的主题的唯一上下文。任何其他实例都将使用系统默认主题来扩展您的视图,从而导致您可能没有预料到的显示输出。

Context, What Context?

这就是getApplicationContext()无法正确设置主题的原因。

答案 1 :(得分:0)

将tips_root background shap xml放入 res / drawable 。 使用android:background代替style="?Tips_Background"

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tips_root"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="8dip"
    android:orientation="horizontal"
    android:background="@drawable/Tips_Background" >

答案 2 :(得分:0)

我最终将问题缩小到将getApplicationContext()返回的上下文传递给PopupWindow构造函数。如果我将LoginActivity.this作为上下文传递,则事情按预期工作,并且我可以根据父活动中选择的主题更改背景。

仍然打败我为什么getApplicationContext()没有我设置的主题。值得深思。