2012-07-20 52 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); 

}