2011-04-23 112 views
0

我一直在爲應用程序設計一個首選項屏幕,而且我甚至沒有在屏幕崩潰前顯示屏幕。我檢查了幾個關於共享偏好的教程,我的代碼與他們的代碼類似,但沒有任何工作。我認爲問題出在我的preferences.xml文件中,因爲我在PreferenceActivity中打開了除XML文件之外的所有內容。開始首選項屏幕時,Android應用程序會立即崩潰

這裏是我的preferences.xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory 
    android:title="Password"> 
    <EditTextPreference 
     android:name="Your Password" 
     android:title="Password" 
     android:defaultValue="" 
     android:summary="For logging in if facial recognition fails" 
     android:key="password" /> 
    <EditTextPreference 
     android:name="Max Attempts" 
     android:title="Max Attempts" 
     android:defaultValue="3" 
     android:summary="Max number of times to try authentication before falling back to password" 
     android:key="maxAttempts" /> 
    </PreferenceCategory> 
    <PreferenceCategory 
    android:title="Security"> 
    <CheckBoxPreference 
     android:title="Intruder Alert" 
     android:defaultValue="false" 
     android:summary="Notify me if you detect a face other than mine" 
     android:key="intruderAlert" /> 
     </PreferenceCategory> 
    <PreferenceCategory 
     android:title="Intruder Notification"> 
     <EditTextPreference 
     android:name="Your Email" 
     android:title="email" 
     android:defaultValue="" 
     android:summary="An email address for us to notify" 
     android:key="email" /> 
     <EditTextPreference 
     android:name="Your Phone Number" 
     android:title="phoneNumber" 
     android:defaultValue="" 
     android:summary="A phone number for us to notify" 
     android:key="phoneNumber" />    
     </PreferenceCategory> 
</PreferenceScreen> 

而且,如果我錯了,我的問題是我的Java文件,這裏的PreferenceActivity。目前大部分都被註釋掉了,但程序仍然崩潰。

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener { 

    /*private EditTextPreference password; 
    private EditTextPreference maxAttempts; 
    private CheckBoxPreference intruderAlert; 
    private EditTextPreference email; 
    private EditTextPreference phoneNumber; 

    String PassWord; 
    int MaxAttempts; 
    boolean IntruderAlert; 
    String Email; 
    String PhoneNumber;*/ 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
     //password = (EditTextPreference) getPreferenceScreen().findPreference("password"); 
     //maxAttempts = (EditTextPreference) getPreferenceScreen().findPreference("maxAttempts"); 
     //intruderAlert = (CheckBoxPreference) getPreferenceScreen().findPreference("intruderAlert"); 
     //email = (EditTextPreference) getPreferenceScreen().findPreference("email"); 
     //phoneNumber = (EditTextPreference) getPreferenceScreen().findPreference("phoneNumber"); 
    } 

    private void setSummaries() 
    { 

    } 

    @Override 
    protected void onResume() 
    { 
     /*super.onResume(); 
     String intruderAlertSetting; 
     if (intruderAlert.isChecked()) 
      intruderAlertSetting = "on"; 
     else 
      intruderAlertSetting = "off"; 
     password.setSummary("Your password is " +password.getText()+ "."); 
     maxAttempts.setSummary("The max attempts that will be made is "+maxAttempts.getText() + "."); 
     intruderAlert.setSummary("You have intruder alert set to" + intruderAlertSetting+"."); 
     if (email.getText().equals("")) 
      email.setSummary("You have no email address stored."); 
     else 
      email.setSummary("Your stored email address is "+email.getText() + "."); 
     if (phoneNumber.getText().equals("")) 
      phoneNumber.setSummary("You have no phone number stored."); 
     else 
      phoneNumber.setSummary("Your stored phone number is " + phoneNumber.getText()+"."); 
     // Set up a listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
       .registerOnSharedPreferenceChangeListener(this);*/ 

    } 

    @Override 
    protected void onPause() 
    { 
     /*super.onPause(); 

     String intruderAlertSetting; 
     if (intruderAlert.isChecked()) 
      intruderAlertSetting = "on"; 
     else 
      intruderAlertSetting = "off"; 
     password.setSummary("Your password is " +password.getText()+ "."); 
     maxAttempts.setSummary("The max attempts that will be made is "+maxAttempts.getText() + "."); 
     intruderAlert.setSummary("You have intruder alert set to" + intruderAlertSetting+"."); 
     if (email.getText().equals("")) 
      email.setSummary("You have no email address stored."); 
     else 
      email.setSummary("Your stored email address is "+email.getText() + "."); 
     if (phoneNumber.getText().equals("")) 
      phoneNumber.setSummary("You have no phone number stored."); 
     else 
      phoneNumber.setSummary("Your stored phone number is " + phoneNumber.getText()+"."); 

     // Unregister the listener whenever a key changes 
     getPreferenceScreen().getSharedPreferences() 
       .unregisterOnSharedPreferenceChangeListener(this);*/ 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) 
    { 
     /*String intruderAlertSetting; 
     if (intruderAlert.isChecked()) 
      intruderAlertSetting = "on"; 
     else 
      intruderAlertSetting = "off"; 
     password.setSummary("Your password is " +password.getText()+ "."); 
     maxAttempts.setSummary("The max attempts that will be made is "+maxAttempts.getText() + "."); 
     intruderAlert.setSummary("You have intruder alert set to" + intruderAlertSetting+"."); 
     if (email.getText().equals("")) 
      email.setSummary("You have no email address stored."); 
     else 
      email.setSummary("Your stored email address is "+email.getText() + "."); 
     if (phoneNumber.getText().equals("")) 
      phoneNumber.setSummary("You have no phone number stored."); 
     else 
      phoneNumber.setSummary("Your stored phone number is " + phoneNumber.getText()+"."); 
     PassWord = password.getText(); 
     MaxAttempts = Integer.parseInt(maxAttempts.getText()); 
     IntruderAlert = intruderAlert.isChecked(); 
     Email = email.getText(); 
     PhoneNumber = phoneNumber.getText();*/ 

    } 
} 

這裏是崩潰的logcat的信息:

04-23 16:37:09.181: WARN/dalvikvm(818): threadid=1: thread exiting with uncaught exception (group=0x40015560) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818): FATAL EXCEPTION: main 
04-23 16:37:09.221: ERROR/AndroidRuntime(818): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cs.fsu.edu.project4/com.cs.fsu.edu.project4.Preferences}: android.view.InflateException: Binary XML file line #2: Error inflating class PreferenceScreen 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1622) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1638) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.os.Looper.loop(Looper.java:123) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.ActivityThread.main(ActivityThread.java:3647) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at java.lang.reflect.Method.invoke(Method.java:507) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at dalvik.system.NativeStart.main(Native Method) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class PreferenceScreen 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:581) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.inflate(LayoutInflater.java:386) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.Activity.setContentView(Activity.java:1657) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at com.cs.fsu.edu.project4.Preferences.onCreate(Preferences.java:33) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1586) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  ... 11 more 
04-23 16:37:09.221: ERROR/AndroidRuntime(818): Caused by: java.lang.ClassNotFoundException: android.view.PreferenceScreen in loader dalvik.system.PathClassLoader[/data/app/com.cs.fsu.edu.project4-1.apk] 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at java.lang.ClassLoader.loadClass(ClassLoader.java:551) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.createView(LayoutInflater.java:471) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:549) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:66) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:568) 
04-23 16:37:09.221: ERROR/AndroidRuntime(818):  ... 19 more 
04-23 16:37:09.251: WARN/ActivityManager(62): Force finishing activity com.cs.fsu.edu.project4/.Preferences 
+0

您編程的API級別是什麼? – 2011-04-23 16:48:23

+0

我正在爲Android 2.2編程。 – dragoncrazy10 2011-04-23 16:51:58

+0

您是否試圖從xml文件中刪除<?xml version =「1.0」encoding =「utf-8」?>? – RoflcoptrException 2011-04-23 16:55:29

回答

1

不知何故,應用程序認爲PreferenceScreen是包android.view的,但系統的文檔只知道它在包android.preference

Caused by: java.lang.ClassNotFoundException: android.view.PreferenceScreen in loader dalvik.system.PathClassLoader[/data/app/com.cs.fsu.edu.project4-1.apk] 

你有沒有在你的應用程序中添加一些名爲PreferenceScreen的類,這可能會混淆系統?

+0

我沒有添加任何稱爲PreferenceScreen的類,但有什麼方法可以改變應用程序在PreferenceScreen的錯誤位置搜索嗎? – dragoncrazy10 2011-04-23 18:32:05

3

也許您可以更改您的偏好架構,嘗試刪除存儲在/ dbdata/databases/com_your_app/shared_prefs /或/ data/data/com_your_app中的舊特性文件。

1

我想在這裏添加我的分。我的經驗是,總是做一個乾淨的構建,總是檢查您的清單的意圖,活動,過濾器,權限。

檢查軟件包名稱,有時會重命名可能出錯的軟件包。

安裝前刪除以前的應用程序(在不同的PC上創建?),刪除舊的設置。

這一切都出了毛病,我:-)

如果這不起作用,所有文件複製到一個新的項目。愚蠢的,但這對我有用 - 沒有評論一切,仍然沒有奏效。然後:ping,開始&去。

3

在您的喜好活動的onCreate你可能有這樣的:

setContentView(R.xml.prefs); 

,你需要這樣的事情,而不是:

addPreferencesFromResource(R.xml.prefs);

參考:PreferenceScreen class not found

1

確保您有AndroidManifest.xml文件中列出的活動

<activity android:name=".Preferences"></activity>

相關問題