在Android 2.3.3或4.2上编程设置时,半透明主题不工作



我有两个活动

public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 }
 public void click(View view) {
  Intent intent= new Intent(this, TranslucentActivity.class);
  startActivity(intent);        
 }
}
public class TranslucentActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  this.setTheme(android.R.style.Theme_Translucent);
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_translucent);
 }
}
布局activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:onClick="click" />
</RelativeLayout>
布局activity_translucent

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TranslucentActivity" >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:text="Hello_world" />
</RelativeLayout>
清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.translucencytest"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.translucencytest.MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.translucencytest.TranslucentActivity">
        </activity>
    </application>
</manifest>

当我点击MainActivity中的按钮时,它会启动带有透明背景的TranslucentActivity。在4.0.3平台上的安卓模拟器看起来都很好,但在其他平台上,例如2.3.3或4.2,我得到黑色背景而不是透明的。怎么了?

注:我不想使用manifest来声明活动的主题。

有很多关于setTheme()的讨论,或者说是为什么setTheme()不像预期的那样工作:

  • https://code.google.com/p/android/issues/detail?id=4394
  • https://code.google.com/p/android/issues/detail?id=3793
  • https://groups.google.com/forum/?fromgroups= !主题/android开发者/vSZHsVWUCqk
  • 为什么getApplicationContext().setTheme()在一个活动不工作?

这个讨论的精髓是setTheme不能很好地工作,而在manifest中设置主题却可以(甚至Dianne Hackborn建议使用manifest方式而不是setTheme()方式,参见上面的第三个链接)。在定义背景时尤其如此。不幸的是,您在模拟器或图形布局编辑器中获得的结果不能转移到现实世界(说实际设备)。因此,您在4.0.3模拟器中看到的内容可能与实际设备上的不一样(正如您已经注意到的;-)。

如果没有特定的理由使用setTheme来主题你的活动,那么我建议改变你的清单,像这样:

<activity android:name=".TranslucentActivity"
          android:theme="@android:style/Theme.Translucent"/>

你仍然可以使用setTheme来主题你的布局的其他元素,但我还没有找到任何其他工作的解决方案,当它涉及到创建透明或对话框活动

<activity android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.example.translucencytest.MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:name="com.example.translucencytest.TranslucentActivity">
</activity>

最新更新