解决方案 »

  1.   

    Resources cResource = EPreferenceActivity.this.getResources(); 这样写Context上下文还没初始化,
    当你new EPreferenceActivity() 的时候才初始化父类的东西。 getResources(); 方法依赖上下文的初始化。
      

  2.   

    package cn.elapser.elapserime;import cn.elapser.elapserime.data.EData;
    import cn.elapser.elapserime.data.EDictionaryData;
    import cn.elapser.elapserime.data.EKeylayoutData;
    import cn.elapser.elapserime.file.EAssetsFile;
    import cn.elapser.elapserime.file.EDataFile;
    import cn.elapser.elapserime.file.EFile;
    import cn.elapser.elapserime.file.ESDCardFile;import android.content.Intent;
    import android.content.res.Resources;
    import android.os.Bundle;
    import android.preference.Preference;
    import android.preference.PreferenceActivity;
    import android.preference.PreferenceScreen;
    import android.widget.Toast;public class EPreferenceActivity extends PreferenceActivity implements
    Preference.OnPreferenceClickListener {
    private static final String[] cPreferenceKeys = { "keylayout_import",
    "keylayout_outport", "keylayout_reset", "dictionary_import",
    "dictionary_outport", "dictionary_reset", "reboot_reboot" };

    private final CPreference.COperator cImportor = new CPreference.CImportOperator();
    private final CPreference.COperator cOutportor = new CPreference.COutportOperator();
    private final EKeylayoutData cKeylayoutData = new EKeylayoutData();
    private final EDictionaryData cDictionaryData = new EDictionaryData();
    private final EAssetsFile cAssetsFile = new EAssetsFile(this);
    private final EDataFile cDataFile = new EDataFile(this);
    private final ESDCardFile cSDCardFile = new ESDCardFile(this); private Intent mIntent;
    private PreferenceScreen[] mPreferences; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mIntent = new Intent("cn.elapser.elapserime.EInputMethodService");
    addPreferencesFromResource(R.xml.preference);
    mPreferences = new PreferenceScreen[cPreferenceKeys.length];
    for (int i = 0; i < cPreferenceKeys.length; i++) {
    mPreferences[i] = (PreferenceScreen) findPreference(cPreferenceKeys[i]);
    mPreferences[i].setOnPreferenceClickListener(this);
    }
    } @Override
    public boolean onPreferenceClick(Preference preference) {
    final Resources cResource = getResources();
    final String cImtportTitle = cResource
    .getString(R.string.preference_import_titile);
    final String cOutportTitle = cResource
    .getString(R.string.preference_outport_titile);
    final String cResetTitle = cResource
    .getString(R.string.preference_reset_titile);
    final String cRebotTitle = cResource
    .getString(R.string.preference_reboot_rebooting);
    final String cOperateSucceeded = cResource
    .getString(R.string.preference_operate_succeeded);
    final String cOperateFailed = cResource
    .getString(R.string.preference_operate_failed);
    final CPreference[] cPreferences = {
    new CPreference(cImportor, cKeylayoutData, cSDCardFile,
    cDataFile, cImtportTitle),
    new CPreference(cOutportor, cKeylayoutData, cDataFile,
    cSDCardFile, cOutportTitle),
    new CPreference(cImportor, cKeylayoutData, cAssetsFile,
    cDataFile, cResetTitle),
    new CPreference(cImportor, cDictionaryData, cSDCardFile,
    cDataFile, cImtportTitle),
    new CPreference(cOutportor, cDictionaryData, cDataFile,
    cSDCardFile, cOutportTitle),
    new CPreference(cImportor, cDictionaryData, cAssetsFile,
    cDataFile, cResetTitle) };
    final String[] cOperateResults = { cOperateSucceeded, cOperateFailed };
    String text = null;
    do {
    int i;
    for (i = 0; i < 6 && mPreferences[i] != preference; i++)
    ;
    if (i < 6) {
    int result = cPreferences[i].operate();
    if (result != 0)
    result = 1;
    text = cPreferences[i].pTitle + cOperateResults[result];
    } else if (mPreferences[6] == preference) {
    text = cRebotTitle;
    mIntent.putExtra("Rebooting", true);
    sendBroadcast(mIntent);
    }
    } while (false);
    if (text != null) {
    Toast toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
    toast.show();
    return true;
    }
    return false;
    } private static class CPreference {
    public COperator pOperator;
    public EData pData;
    public EFile pReader;
    public EFile pWriter;
    public String pTitle; public CPreference(COperator operator, EData data, EFile reader,
    EFile writer, String title) {
    pOperator = operator;
    pData = data;
    pReader = reader;
    pWriter = writer;
    pTitle = title;
    } public int operate() {
    return pOperator.operate(pData, pReader, pWriter);
    } public abstract static class COperator {
    public int operate(EData data, EFile reader, EFile writer) {
    return 0;
    }
    } public static class CImportOperator extends COperator {
    @Override
    public int operate(EData data, EFile reader, EFile writer) {
    return EData.importFile(data, reader, writer);
    }
    } public static class COutportOperator extends COperator {
    @Override
    public int operate(EData data, EFile reader, EFile writer) {
    return EData.outportFile(data, reader, writer);
    }
    }
    }
    }
    我想把所有final变量变成EPreferenceActivity的成员变量
      

  3.   

    本来想把他们声明为final类型的以符合统一代码风格
    但是android源代码的解决方案都是改成普通成员变量
    所以无所谓了