如何以编程方式打开或模拟用XML创建的android首选项上的单击?
我有一个用XML声明首选项的android应用程序,加载了如何以编程方式打开或模拟用XML创建的android首选项上的单击?,android,android-preferences,Android,Android Preferences,我有一个用XML声明首选项的android应用程序,加载了addPreferencesFromResource。用户可以打开首选项,单击每个项目并编辑它们,所有的工作 我的一个偏好是: <ListPreference android:key="abc" android:title="@string/abc" android:summary="@string/cde" android:persistent
addPreferencesFromResource
。用户可以打开首选项,单击每个项目并编辑它们,所有的工作
我的一个偏好是:
<ListPreference android:key="abc"
android:title="@string/abc"
android:summary="@string/cde"
android:persistent="true"/>
如何自动向用户显示首选项对话框(无需用户转到首选项屏幕并单击它?)
我尝试了((android.preference.DialogPreference)prefMgr.findPreference(“abc”)).showDialog(null)
,但它说这是一个受保护的方法。。。?从我的主要活动(这是一个首选活动
)中调用它,这就是它显然无法工作的原因。但除此之外呢
编辑
我刚刚找到了两个线程(、和),打算使用findviewbyd
访问首选项,但没有成功。它总是返回null(对我也是如此)
看起来真的不可能从代码中做到这一点。请参阅新的公认答案,以获得更简洁的方法!这是可行的,但并不是一种干净的方式
该死的,我花了好几个小时,但终于成功了 解决方案是未记录的呼叫。它有几个参数,正如所指出的,它可以用来根据要调用的元素的索引模拟单击 我的问题是,我要调用的项深深嵌套在XML结构中。但解决方案非常简单:在
首选项屏幕中添加键
,您要打开的项目位于:
<PreferenceScreen
android:key="pref_key"
....
/>
<ListPreference android:key="abc"
android:title="@string/abc"
android:summary="@string/cde"
android:persistent="true"/>
</PreferenceScreen>
然后弹出对话框
最好是进入首选项屏幕
a首选项
(这样你就不必知道你的首选项
在哪里),因为移动首选项/更改XML可能会自动中断对话框,并且可能不会引起注意(如果没有测试)
为此,我编写了一个函数,它将搜索所有首选项,并返回首选项屏幕
您的首选项已打开,因此您不需要为首选项屏幕设置一个键
private PreferenceScreen findPreferenceScreenForPreference( String key, PreferenceScreen screen ) {
if( screen == null ) {
screen = getPreferenceScreen();
}
PreferenceScreen result = null;
android.widget.Adapter ada = screen.getRootAdapter();
for( int i = 0; i < ada.getCount(); i++ ) {
String prefKey = ((Preference)ada.getItem(i)).getKey();
if( prefKey != null && prefKey.equals( key ) ) {
return screen;
}
if( ada.getItem(i).getClass().equals(android.preference.PreferenceScreen.class) ) {
result = findPreferenceScreenForPreference( key, (PreferenceScreen) ada.getItem(i) );
if( result != null ) {
return result;
}
}
}
return null;
}
private void openPreference( String key ) {
PreferenceScreen screen = findPreferenceScreenForPreference( key, null );
if( screen != null ) {
screen.onItemClick(null, null, findPreference(key).getOrder(), 0);
}
}
// With this, you can call your `Preference` like this from code, you do
// not even have to give your PreferenceScreen a key!
openPreference( "abc" );
private PreferenceScreen FindPreferenceScreen引用(字符串键,PreferenceScreen屏幕){
如果(屏幕==null){
screen=getPreferenceScreen();
}
PreferenceScreen结果=空;
android.widget.Adapter ada=screen.getRootAdapter();
for(int i=0;i
等等,你也可以这样做
Preference p=findPreference("settings_background_color");
p.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
int color=PreferenceManager.getDefaultSharedPreferences(ALifePatternsWallpaperSettings.this).getInt("settings_background_color", Color.BLACK);
new ColorPickerDialog(ALifePatternsWallpaperSettings.this, ALifePatternsWallpaperSettings.this, "settings_background_color", color, Color.BLACK).show();
return true;
}
});
您可以扩展ListPreference来创建对话框,然后包括自己的公共方法,该方法调用ListPreference的受保护showDialog方法。比如:
public void show()
{
showDialog(null);
}
这样,您就不会遇到getOrder()不工作的问题,因为有一些人在您的答案的评论中指出了首选项组
这可以通过任何具有受保护的showDialog方法的首选项类型来完成。嗨,朋友们,请在工作正常的情况下尝试此代码
getPreferenceManager().findPreference("YOUR PREF_KEY").setOnPreferenceClickListener(new OnPreferenceClickListener()
{
public boolean onPreferenceClick(Preference preference)
{
//your code here
return true;
}
});
PreferenceScreen PreferenceScreen=(PreferenceScreen)findPreference(“pref_键”);
final ListAdapter ListAdapter=preferenceScreen.getRootAdapter();
EditTextPreference editPreference=(EditTextPreference)FindReference(“设置密码首选项”);
final int itemscont=listAdapter.getCount();
整数项目编号;
对于(itemNumber=0;itemNumber
改进deepak goel
的答案:
private void openPreference(String key) {
PreferenceScreen preferenceScreen = getPreferenceScreen();
final ListAdapter listAdapter = preferenceScreen.getRootAdapter();
final int itemsCount = listAdapter.getCount();
int itemNumber;
for (itemNumber = 0; itemNumber < itemsCount; ++itemNumber) {
if (listAdapter.getItem(itemNumber).equals(findPreference(key))) {
preferenceScreen.onItemClick(null, null, itemNumber, 0);
break;
}
}
}
private void openPreference(字符串键){
PreferenceScreen PreferenceScreen=getPreferenceScreen();
final ListAdapter ListAdapter=preferenceScreen.getRootAdapter();
final int itemscont=listAdapter.getCount();
整数项目编号;
对于(itemNumber=0;itemNumber
如果使用支持库,您可以轻松地打开一个对话框
在您的首选项FragmentCompat中:
getPreferenceManager().showDialog(findPreference("pref_name"));
请注意,支持首选项包存在许多问题:
和
.如果您使用的是AndroidX首选项库,它非常简单
public class CustomPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.your_preference);
DialogPreference dialogPreference = (DialogPreference) findPreference("your_preference_key");
onDisplayPreferenceDialog(dialogPreference);
}
}
您想在所有首选项屏幕中只显示一个字段吗?或者干脆打开整个首选项对话框?我想显示我的列表首选项
(或任何对话框首选项
)对话框,就像我在首选项屏幕中直接单击它一样,它会弹出-相应地编辑它。对不起,我的第一个问题有误导性。CheckBoxPreference
没有弹出的对话框,您只需打开和关闭它。您是对的,这是一个推理错误。仍然存在对话框首选项
(更具体地说是列表首选项
)的问题。更新了我的问题。编辑:好的,我明白了。是否使用现有设置在单击时创建新对话框?你能
getPreferenceManager().showDialog(findPreference("pref_name"));
public class CustomPreferenceFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.your_preference);
DialogPreference dialogPreference = (DialogPreference) findPreference("your_preference_key");
onDisplayPreferenceDialog(dialogPreference);
}
}