Java Android首选项onclick事件
在my preferences.xml中,我有一个类似以下的preferences元素: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
<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;
}
});
}