8

私は自分のアプリケーション全体で奇妙なフォーマットスタイルの不一致の原因を見つけようとしてきましViewsたが、この例でそれを絞り込んだと思います。

Viewsまったく同じ手順で、作成時に提供されたものを変更するだけで、さまざまなの2つの同等のレイアウトを設定しましたContext。最初のセットでは、それぞれViewがを介してアプリケーションのコンテキストで作成されますActivity.getApplicationContext()が、2番目のセットでは、Viewsはを介してアクティビティのコンテキストにフィードされます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>
4

1 に答える 1

12

Androidのソースでは、getApplicationContext()拡張するApplicationオブジェクトを返すため、サブクラスを渡すContextWrapperことを使用しgetApplicationContext()ますが、を渡すと、拡張するオブジェクトを渡すため、サブクラスを渡すことになります。との違いは、すべての呼び出しを別のコンテキストに委任するだけ、ラップされたコンテキストにあるものからテーマを変更できることですContextWrapperthisActivityContextThemeWrapperContextThemeWrapperContextWrapperContextThemeWrapperContextWrapper ContextThemeWrapper

質問は、なぜこれが正確に起こっているのか(明確な原因ではなく)に関するものでしたが、アプリケーションコンテキストを誤って使用することの危険性と、コンテキストを正しく選択する方法を説明する役立つ投稿もいくつかあります。

@CommonsWareから最も重要なのは、 「getApplicationContext()は完全なコンテキストではないため、Activityが行うすべてのことをサポートしているわけではない」ということです。

すべてを明確にする必要があるコンテキストに関する素晴らしい投稿:

于 2013-02-12T07:51:14.713 に答える