从preferences.xml启动一个活动

7
我正在尝试进入以下位置的设置屏幕 -
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS

我希望从偏好设置页面中的一个条目开始,但是一直没有成功。目前,点击该条目只会刷新与我所在页面相同的屏幕。

我的preferences.xml文件如下:

<Preference
         android:title="@string/my_location_settings">
    <intent android:action="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS">
    </intent>
 </Preference>

我的清单条目看起来像这样:

<activity android:name=".Preferences">
        <intent-filter>
            <action android:name="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

我错在哪里了?

日志记录:

12-11 15:53:34.170: INFO/ActivityManager(173): Starting activity: Intent { act=android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS cmp=com.my.app/.Preferences }
12-11 15:53:34.400: INFO/ActivityManager(173): Displayed activity com.my.app/.Preferences: 229 ms (total 229 ms)

清单:

<?xml version="1.0" encoding="utf-8"?>

    <activity android:name=".ViewActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MyPageOneActivity">
    </activity>
    <activity android:name=".MyPageTwoActivity">
    </activity>
    <activity android:name=".MyPageThreeActivity">
    </activity>
    <activity android:name=".Preferences">
        <intent-filter>
            <action android:name="com.my.app.PREFERENCES" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

<uses-sdk android:minSdkVersion="4" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
</uses-permission>
</manifest>

Preferences.java (抱歉,格式不太好):

首选项.java
  package com.my.app;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Preferences extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.preferences);
    }
}

并且是 preferences.xml:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<EditTextPreference 
    android:title="Address 1"
    android:key="customURLOne" 
    android:summary="Enter a new address for 1">
</EditTextPreference>
<EditTextPreference 
    android:title="Address 2"
    android:key="customURLTwo" 
    android:summary="Enter a new address for 2">
</EditTextPreference>
<EditTextPreference 
    android:title="Address 3"
    android:key="customURLThree" 
    android:summary="Enter a new address for 3">
</EditTextPreference>
 <Preference android:title="@string/my_location_settings">
    <intent android:action="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS">
    </intent>
 </Preference>


日志记录器(logcat)显示了什么?另外,你能发布一下你主要的首选项页面(manifest entry)的清单条目吗?那个你一直回到的页面。 - EboMike
这是我的主要首选项页面的清单条目,日志记录: - qubz
12-11 15:53:34.170: INFO/ActivityManager(173): 启动活动:Intent { act=android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS cmp=com.my.app/.Preferences } 12-11 15:53:34.400: INFO/ActivityManager(173): 显示活动 com.my.app/.Preferences:229 毫秒(总共 229 毫秒) - qubz
哦,抱歉,我想要访问的是 Android 操作系统的一部分,我也可以使用警报框来访问它,方法如下: Intent myLocationOptionsIntent = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(myLocationOptionsIntent); 这将在 Android 设置列表下打开“位置和安全性”设置。 - qubz
我不明白。你的偏好意图正在说ACTION_LOCATION_SOURCE_SETTINGS,所以显然你正在尝试启动活动“.Preferences”。 - EboMike
显示剩余2条评论
2个回答

11

好的,我想我明白了——您可能不清楚什么是intent-filter。

您的清单条目如下:

<activity android:name=".Preferences">

这是你的活动名称为[your package].Preferences的定义。

 <intent-filter>
    <action android:name="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS" />

每当有人启动一个操作名称为ACTION_LOCATION_SOURCE_SETTINGS的意图时,偏好设置就会被触发...

        <category android:name="android.intent.category.DEFAULT" />

这应该是该操作的默认选项。

    </intent-filter>
</activity>

显然,你不想在你的活动中使用一个Android API操作名称 (除非你正在尝试提供一种替代Android内置的位置源活动)。为你的主要首选项屏幕使用不同的操作名称,最好是包含你的包名称。

编辑: 还可以尝试使用PreferenceScreen:

<PreferenceScreen android:title="@string/my_location_settings">
    <intent android:action="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS">
    </intent>
</PreferenceScreen>

没有用,我在清单文件中将操作名称更改为- <action android:name="com.my.app.PREFERENCES" />,但是没有成功。我会在原始帖子中发布整个清单文件、首选项活动和preferences.xml。 - qubz
啊,还有一件事 - 您的首选项项目需要是PreferenceScreen。我会编辑我的答案。 - EboMike
谢谢。我现在得走了,回来后会继续处理,再次感谢。 - qubz
我们正在前往目的地。android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS 是 Android API 中的一个静态字符串,它是"android.settings.LOCATION_SOURCE_SETTINGS"。请使用该字符串。 - EboMike
太棒了!它起作用了!!这太好了,非常感谢EboMike。我绝对不会知道那是那个字符串。问题解决 :) - qubz
显示剩余4条评论

3

对我来说什么都不起作用,所以我做了以下操作:(我认为这是一个不好的主意,但是...)

1.从清单中删除此过滤器。

<intent-filter>
<action android:name="android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>

1. 简化偏好设置

<Preference android:key="simple_key"
        android:title="@string/title_simple_key">
    </Preference>

2. 在您的PreferenceFragment中添加Clicklistener

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    addPreferencesFromResource(R.layout.preferences);
    // Load the preferences from an XML resource
    findPreference("simple_key").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
        @Override
        public boolean onPreferenceClick(Preference preference) {
            startActivity(new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
            return false;
        }
    });

}

PS.对于我的英语,我感到抱歉。


我不知道为什么,但是使用另一种方法而不是我声明的活动时,它再次打开了首选项活动,所以这种方法对我起作用了(: - FeanDoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接