Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android首选项onclick事件_Java_Android_Android Preferences - Fatal编程技术网

Java Android首选项onclick事件

Java Android首选项onclick事件,java,android,android-preferences,Java,Android,Android Preferences,在my preferences.xml中,我有一个类似以下的preferences元素: <Preference android:title="About" /> 我想分配onClick事件,所以如果用户点击它,我就可以打开新的Intent或浏览器。我试图像使用按钮一样执行此操作,但似乎不起作用。您需要使用onPreferenceTreeClick事件 例如见 您需要为以下项目设置android:key: 然后,您可以在代码中执行以下操作: Preference myPre

在my preferences.xml中,我有一个类似以下的preferences元素:

<Preference android:title="About" />


我想分配
onClick
事件,所以如果用户点击它,我就可以打开新的
Intent
或浏览器。我试图像使用按钮一样执行此操作,但似乎不起作用。

您需要使用onPreferenceTreeClick事件

例如见


您需要为以下项目设置
android:key


然后,您可以在代码中执行以下操作:

Preference myPref=(Preference)findPreference(“myKey”);
myPref.setOnPreferenceClickListener(新的OnPreferenceClickListener(){
公共布尔值打开首选项单击(首选项){
//在此处打开浏览器或意图
返回true;
}
});
要启动网站:

<PreferenceScreen android:title="website">
    <intent
        android:action="android.intent.action.VIEW"
        android:data="http://www.example.com"
        />
</PreferenceScreen>

要启动特定活动,请执行以下操作:

<PreferenceScreen android:title="something">
    <intent
        android:action="android.intent.action.MAIN"
        android:targetPackage="com.example.foo"
        android:targetClass="com.example.foo.SomeActivity"
        />
</PreferenceScreen>


您还可以使用“android:mimetype”设置mimetype。

关于@jason gilbert答案的后续信息

我在targetSdkVersion 25上,他的回答不起作用,我不得不用首选项标记包装意图标记。例如:

<PreferenceScreen android:title="something">
    <Preference title="Title">
       <intent
       android:action="android.intent.action.MAIN"
       android:targetPackage="com.example.foo"
       android:targetClass="com.example.foo.SomeActivity"
       />
    </Preference>
</PreferenceScreen>

2018+更新 如今,
findPreference
方法已被废弃。因此,要实现这一点,只需覆盖首选项片段中的
onPreferenceTreeClick
方法。例如:

public class MySettingsFragment extends PreferenceFragment {

    @Override
    public boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen,
                                          Preference preference)
    {
        String key = preference.getKey();
        if(key.equals("someKey")){
            // do your work
            return true;
        }
        return false;
    }
}
此外,如果需要在特定的首选项元素(例如,
ListPreference
)内处理单击,则应在
MySettingsFragment
onCreate
方法内注册
setOnPreferenceChangeListener

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

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    // register listener
    final Preference prefList = findPreference("key");
    prefList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        public boolean onPreferenceChange(Preference preference, Object value) {
            System.out.println("Selected: " + value);
            return true;
        }
    });
}

我该把这个放在哪里?在我的设置中,
onPostCreate
中的活动不起作用,因为太早了(空指针异常)。感谢所有帮助
findPreference
不推荐使用。
PreferenceActivity.findPreference
不推荐使用。但是,文档中说:“现在应该在新的PreferenceFragment类中找到此功能。如果您在旧模式下使用PreferenceActivity,则此处的文档适用于不推荐使用的API。”,并且
PreferenceFragment.FindReference
未被推荐使用(从编写本文时的API级别23开始). 因此,
findReference
本身并没有遭到反对;这是不推荐使用的
PreferenceActivity
的直接用法。谷歌希望我们改为使用
PreferenceFragment
,而不是放弃
findPreference
。在
onPreferenceClick
中,如果点击是在其他地方处理的,则返回
true
。这对我使用preferencefragmentcompatividers很有效。我同意,这种方法更好,特别是因为它没有使用现在不推荐的FindReference(字符串键)方法,而且总体上更干净。非常好,但是也可以通过这种方式创建IntentChooser吗?@jasongilbert是否可以发送带有操作的广播,而不是从首选项单击开始活动?@jasongilbert我是否应该在清单中为
SomeActivity
指定任何
intent筛选器
,因为我正在获得
ActivityNotFoundException
:(链接是404首选项单击与首选项树单击之间的区别是什么?
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    // register listener
    final Preference prefList = findPreference("key");
    prefList.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        public boolean onPreferenceChange(Preference preference, Object value) {
            System.out.println("Selected: " + value);
            return true;
        }
    });
}