我有两个活动
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>