B T*_*B T 8 java android android-context android-theme android-styles
我一直试图Views
在整个应用程序中找到奇怪的格式化样式不一致的原因,我想我已经用这个例子缩小了它.
我Views
使用完全相同的过程设置了两个等效的各种s 布局,并且只改变了Context
创建中提供的内容.在第一个集合中,每个View
都是通过应用程序的上下文创建的Activity.getApplicationContext()
,而在第二个集合中,View
s是通过活动的上下文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);
}
}
Run Code Online (Sandbox Code Playgroud)
表现:
<?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>
Run Code Online (Sandbox Code Playgroud)
Mic*_* Z. 12
在Android源代码中getApplicationContext()
返回扩展的Application对象ContextWrapper
,因此使用getApplicationContext()
您传递ContextWrapper
子类,但是当您传递时this
,您传递的是一个Activity
扩展的对象,ContextThemeWrapper
因此您传递的是ContextThemeWrapper
子类.现在和之间的区别在于ContextWrapper
,ContextThemeWrapper
它ContextWrapper
只是将其所有调用委托给另一个Context,并ContextThemeWrapper
允许您从包装上下文中的内容修改主题.
虽然,问题更多的是为什么会发生这种情况(与明确的原因相反),这里也有一些有用的帖子解释了错误使用应用程序上下文以及如何正确选择上下文的危险:
最重要的是来自@CommonsWare: "getApplicationContext()不是一个完整的Context,因此不支持Activity所做的一切."
关于Context应该澄清一切的很棒的帖子:
归档时间: |
|
查看次数: |
1396 次 |
最近记录: |