Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
如何以编程方式打开或模拟用XML创建的android首选项上的单击?_Android_Android Preferences - Fatal编程技术网

如何以编程方式打开或模拟用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

我有一个用XML声明首选项的android应用程序,加载了
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);
    }
}