我一直试图在整个应用程序中找到Views
奇怪的格式样式不一致的原因,我想我已经用这个例子缩小了它。
我设置了两个具有完全相同过程的Views
个等效布局,仅改变了创建时提供的Context
。在第一个集合中,每个View
都是通过Activity.getApplicationContext()
使用应用程序的上下文创建的,而在第二个集合中,View
通过this
向活动的上下文提供。
结果大不相同:
有关使用应用程序上下文的原因的任何建议都会导致屏幕截图中出现垃圾(并且颜色不一致 - 颜色为白色和灰色)?
活动代码:
import android.os.Bundle;
import android.app.Activity;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// TextViews
TextView tv1 = new TextView(getApplicationContext());
tv1.setText("With Application context");
TextView tv2 = new TextView(this);
tv2.setText("With Activity context");
// Spinners
Spinner sp1 = new Spinner(getApplicationContext());
sp1.setAdapter(new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, new String[] {"App context 1", "App context 2", "App context 3"}));
Spinner sp2 = new Spinner(this);
sp2.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, new String[] {"Act context 1", "Act context 2", "Act context 3"}));
// Edittexts
EditText et1 = new EditText(getApplicationContext());
et1.setText("Application Context");
EditText et2 = new EditText(this);
et2.setText("Activity Context");
// Buttons
Button b1 = new Button(getApplicationContext());
b1.setText("Application Context");
Button b2 = new Button(this);
b2.setText("Activity Context");
// Layout structure
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
ll.addView(tv1);
ll.addView(sp1);
ll.addView(et1);
ll.addView(b1);
ll.addView(tv2);
ll.addView(sp2);
ll.addView(et2);
ll.addView(b2);
setContentView(ll);
}
}
清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light" >
<activity
android:name="com.test.test.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo.Light" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
答案 0 :(得分:12)
在Android源代码getApplicationContext()
中返回扩展ContextWrapper
的Application对象,因此使用getApplicationContext()
传递ContextWrapper
子类,但是当您通过this
时,正在传递Activity
对象,该对象扩展ContextThemeWrapper
,因此您传递ContextThemeWrapper
子类。现在ContextWrapper
和ContextThemeWrapper
之间的区别在于ContextWrapper
simply delegates all of its calls to another Context和ContextThemeWrapper
allows you to modify the theme from what is in the wrapped context。
虽然,问题更多的是为什么会发生这种情况(与明确的原因相反),这里也有一些有用的帖子解释了错误使用应用程序上下文以及如何正确选择上下文的危险: / p>
最重要的是来自@CommonsWare: “getApplicationContext()不是一个完整的Context,因此不支持Activity所做的一切。”
关于应该澄清一切的上下文的精彩文章: