2012-07-20 57 views
0

我在我的活動中有一個按鈕,我想在我的偏好活動中選擇當我點擊它時打開的互聯網網站。在onClick方法上使用SharedPreferences

array.xml是這樣的:

<resources> 
    <integer-array name="sites_values"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </integer-array> 

    <string-array name="sites"> 
     <item>@string/site1</item> 
     <item>@string/site2</item> 
     <item>@string/site3</item> 
    </string-array> 
</resources> 

preference.xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > 
    <ListPreference 
     android:defaultValue="1" 
     android:entries="@array/sites" 
     android:entryValues="@array/sites_values" 
     android:key="websites" 
     android:persistent="true" 
     android:summary="@string/summary" 
     android:title="@string/title" /> 
</PreferenceScreen> 

這是PreferenceActivity:

public void public class MyPreference extends PreferenceActivity { 
    public static final int DEFAULT_SITE = 1; 
    public static final String FAV_SITE = "websites"; 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 

} 

最後這MainActivity的onclick方法不起作用,「應用程序意外停止」錯誤:

public void click(View v) { 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this); 
    String url; 
    switch (pref.getInt(MyPreference.FAV_SITE, 
         MyPreference.DEFAULT_SITE)) { 
     case 1: 
     default: 
      url = "http://www.google.com"; 
      break; 
     case 2: 
      url = "http://www.youtube.com"; 
      break; 
     case 3: 
      url = "http://www.facebook.com"; 
      break; 
    } 
    Intent BrowserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
    startActivity(BrowserIntent); 
} 

我在做什麼錯? onResume已經使用SharedPreferences並且完美地工作。

編輯:

這是logcat的

07-08 16:18:27.540: W/dalvikvm(3041): threadid=1: thread exiting with uncaught exception (group=0xb67f44f0) 
07-08 16:18:27.570: E/AndroidRuntime(3041): FATAL EXCEPTION: main 
07-08 16:18:27.570: E/AndroidRuntime(3041): java.lang.IllegalStateException: Could not execute method of the activity 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.view.View$1.onClick(View.java:2144) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.view.View.performClick(View.java:2485) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.view.View$PerformClick.run(View.java:9080) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.os.Handler.handleCallback(Handler.java:587) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.os.Looper.loop(Looper.java:130) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at dalvik.system.NativeStart.main(Native Method) 
07-08 16:18:27.570: E/AndroidRuntime(3041): Caused by: java.lang.reflect.InvocationTargetException 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at java.lang.reflect.Method.invoke(Method.java:507) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.view.View$1.onClick(View.java:2139) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  ... 11 more 
07-08 16:18:27.570: E/AndroidRuntime(3041): Caused by: java.lang.ClassCastException: java.lang.String 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at android.app.ContextImpl$SharedPreferencesImpl.getInt(ContextImpl.java:2857) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  at it.megaforum.megaapp.MainActivity.clickMegaforum(MainActivity.java:38) 
07-08 16:18:27.570: E/AndroidRuntime(3041):  ... 14 more 

編輯2:

我注意到,當我點擊在爲MyPreference活動的偏好出現另一個錯誤。 如果我從整數數組更改爲字符串數組,此錯誤消失。

+0

嘗試使用,而不是這個MainActivity.class和分享您的堆棧跟蹤 – dilix 2012-07-20 16:00:28

+0

發佈STA CK跟蹤。這將是顯而易見的。 – 2012-07-20 16:15:11

+0

它是LogCat嗎? – SxEdge 2012-07-20 16:42:52

回答

0

我猜「這個」之:

PreferenceManager.getDefaultSharedPreferences(this); 

不適合,你是最有可能在一個內嵌類(偵聽器的按鈕),意思是「這」的引用監聽器類而不是外部類(你的活動)。

編輯:爲了解決這個問題,你只需要參考活動中的首選項。在創建活動時將其設置,然後在「偵聽器」中使用它。或者你只需​​要從一切活動中調用一種方法。

+0

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(preferencesActivity.this); – 2012-07-20 16:20:24

+0

我很抱歉,但我不明白。你能解釋得更好嗎? – SxEdge 2012-07-20 16:48:01

+0

您正在使用「this」來獲取您的活動的默認首選項。但在這種情況下,「this」不引用外部活動,而是引用按鈕的OnClickListener。嘗試Ryan Gray所說的,並在您的方法調用中與preferenceActivity.This交換這個 – CrankMuffler 2012-07-20 16:50:29

0

問題出在整數數組上。 我改變它爲一個字符串數組,現在它的工作。 這是代碼。

array.xml

<resources> 
    <string-array name="sites_values"> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </string-array> 

    <string-array name="sites"> 
     <item>@string/site1</item> 
     <item>@string/site2</item> 
     <item>@string/site3</item> 
    </string-array> 
</resources> 

爲MyPreference

public void public class MyPreference extends PreferenceActivity { 
    public static final String DEFAULT_SITE = "1"; 
    public static final String FAV_SITE = "websites"; 

    @SuppressWarnings("deprecation") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preferences); 
    } 
} 

監聽

public void click(View v) { 
    SharedPreferences pref = PreferenceManager 
      .getDefaultSharedPreferences(MainActivity.this); 
    String url = "http://"; 
    if (pref.getString(MyPreference.FAV_SITE, MyPreference.DEFAULT_SITE).equals("1") { 
     url = "http://www.google.com"; 
    } else if (pref.getString(MyPreference.FAV_SITE, MyPreference.DEFAULT_SITE).equals("2")) { 
     url = "http://www.youtube.com"; 
    } else if (pref.getString(MyPreference.FAV_SITE, MyPreference.DEFAULT_SITE).equals("3")) { 
     url = "http://www.facebook.com"; 
    } 
    Intent BrowserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
    startActivity(BrowserIntent); 

}