gpt4 book ai didi

java - Android Holo Light 样式会根据所选上下文发生变化

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:01:13 24 4
gpt4 key购买 nike

我一直在努力寻找导致我的整个应用程序中的 Views 出现奇怪的格式样式不一致的原因,我想我已经通过这个示例缩小了范围。

我使用完全相同的过程设置了各种 Views 的两个等效布局,并且改变了创建时提供的 Context。在第一组中,每个 View 都是通过 Activity.getApplicationContext() 使用应用程序上下文创建的,而在第二组中,View 是通过 this 提供 Activity 的上下文。

结果大不相同:

enter image description here

关于为什么使用应用程序上下文会导致屏幕截图中出现垃圾(并且不一致 - 颜色是白色和灰色)格式的任何建议?

Activity 代码:

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);
}

}

list :

<?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>

最佳答案

在 Android 源代码中,getApplicationContext() 返回扩展了 ContextWrapper 的 Application 对象,因此使用 getApplicationContext() 您将传递 ContextWrapper 子类,但是当你传递 this 时,你传递的是 Activity 对象,它扩展了 ContextThemeWrapper 所以你传递的是 ContextThemeWrapper 子类。现在 ContextWrapperContextThemeWrapper 之间的区别是 ContextWrapper simply delegates all of its calls to another ContextContextThemeWrapper allows you to modify the theme from what is in the wrapped context .

虽然问题更多的是关于为什么会发生这种情况(而不是明确的原因),但这里也有一些有用的帖子解释了不正确使用应用程序上下文的危险以及如何正确选择上下文:

最重要的来自@CommonsWare:“getApplicationContext() 不是一个完整的上下文,因此不支持 Activity 所做的一切。”

关于 Context 的精彩帖子应该澄清一切:

关于java - Android Holo Light 样式会根据所选上下文发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824342/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com