【问题标题】:Using SharedPreferences on a onClick method在 onClick 方法上使用 SharedPreferences
【发布时间】:2012-07-20 15:52:55
【问题描述】:

我的活动中有一个按钮,我想在我的偏好活动中选择单击它时打开的互联网网站。

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 活动中的首选项时出现另一个错误。 如果我从整数数组更改为字符串数组,这个错误就会消失。

【问题讨论】:

  • 尝试使用 MainActivity.class 而不是这个并分享您的堆栈跟踪
  • 发布堆栈跟踪。这将是显而易见的。

标签: android android-preferences android-button


【解决方案1】:

我猜“这个”在:

PreferenceManager.getDefaultSharedPreferences(this);

不适合您,因为您很可能位于内联类(按钮的侦听器)中,这意味着“this”引用侦听器类而不是外部类(您的活动)。

编辑:要解决此问题,您只需要参考活动中的首选项即可。在创建 Activity 时设置它,然后在 Listener 中使用它。或者你只是从处理所有事情的活动中调用一个方法。

【讨论】:

  • SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(preferencesActivity.this);
  • 对不起,我没听懂。你能解释得更好吗?
  • 您正在使用“this”获取活动的默认首选项。但在这种情况下,“this”不引用外部活动,而是按钮的 OnClickListener。试试 Ryan Gray 所说的,并在你的方法调用中用 preferencesActivity.this 交换 this
  • 如果我将“this”与“MyPreference.this”交换,Eclipse 会显示“在范围内无法访问 MyPreference 类型的封闭实例”。
  • 试试这个:在你的活动中添加一个 SharedPreferences 字段。在 Activity 的 onCreate 中使用 PreferenceManager.getDefaultSharedPreferences(this);然后尝试使用您添加的字段在 onClick 中访问它。
【解决方案2】:

问题出在整数数组上。 我将它更改为字符串数组,现在它可以工作了。 这是代码。

数组.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>

我的偏好

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);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2015-06-10
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多