以编程方式设置android:windowIsTranslucent

时间:2014-07-25 08:57:56

标签: android android-layout android-theme android-styles android-windowmanager

按照本教程http://cases.azoft.com/android-tutorial-floating-activity/

后,我能够创建一个浮动活动

但是,为此,我必须在styles.xml中添加此行:

<item name="android:windowIsTranslucent">true</item>

仅使用Android / Java代码可以产生相同的效果吗? (例如在Activity.onAttachedToWindow()左右......)

提前感谢您的帮助。

[编辑01] styles.xml一定不能改变(我不应该知道它里面有什么......)。但出于测试目的,我使用的是默认值:

<resources>
    <style name="AppBaseTheme" parent="Theme.AppCompat.Light">
    </style>
    <style name="AppTheme" parent="AppBaseTheme">
    </style>
</resources>

[编辑02] Resources.Theme.applyStyle() 似乎按我的意愿行事(根据API说明:“将新属性值放入主题”)。 所以我创建了以下custom_style.xml

<resources>
    <style name="MyCustomStyle" >
        <item name="android:windowIsTranslucent">true</item>
    </style>
</resources>

然后,在onAttachedToWindow()中,我打电话给:

getTheme().applyStyle(R.style.MyCustomStyle, true);

但它没有任何影响......

5 个答案:

答案 0 :(得分:5)

  

仅使用Android / Java代码可以产生相同的效果吗?

我很害怕,不,你必须只在styles.xml进行。单独android:windowIsTranslucent的AFAIK值无法以编程方式更改。

当我们调用super.onCreate(savedInstanceState);时,Activity类提供了一个空的图形窗口,我们在其上设置内容ie.views。并且将一个主题应用于此窗口,然后在此视图上加载内容。

因此序列将是,

  1. 致电super.onCreate()
  2. 为活动设置主题。
  3. 设置该活动的内容视图。
  4. 例如

    <强> styles.xml

    <style name="AppTheme" parent="AppBaseTheme">
    
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    
        <item name="android:windowBackground">@drawable/background</item>
        <item name="android:windowNoTitle">true</item>
    </style>
    
    <!-- Application theme.without title bar -->
    <style name="AppTheme.NoTitleBar" parent="AppBaseTheme">
    
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="android:windowBackground">@drawable/background</item>
        <item name="android:windowNoTitle">true</item>
    </style>
    
    <!--Floating activity theme -->
    <style name="Theme_Translucent" parent="android:style/Theme.NoTitleBar.Fullscreen">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:windowFullscreen">true</item>
    </style>
    

    然后按如下方式设置Floating activity的主题:

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setTheme(R.style.Theme_Translucent); // Set here
        setContentView(...)
    }
    

答案 1 :(得分:1)

不能说以编程方式执行此操作..但如果您需要这样做,您可以尝试这样做..

在清单文件中为您添加主题,如此..

android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"

示例: -

  <activity
            android:name="com.example.androidhackerphonelocker.MainActivity"
            android:label="@string/app_name" 
            android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

希望它能解决你的一些问题..

答案 2 :(得分:1)

这样做

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     Window w = getWindow(); // in Activity's onCreate() for instance
     w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, 
     WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
     w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, 
     WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

答案 3 :(得分:0)

也许这会有所帮助。

@Override
protected void onCreate(Bundle savedInstanceState) {
    processSetTheme(this);
    getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    getWindow().setBackgroundDrawableResource(R.color.realTranslucent);
    if (Build.VERSION.SDK_INT>=19){
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }
    super.onCreate(savedInstanceState);


<color name="realTranslucent">#00000000</color>

答案 4 :(得分:0)

Android R 中出现了 a new method