3

我有 3 个首选项设置:
- EditTextPreference 输入网址
- EditTextPreference 输入端口
- ListPreference 显示网页中的一些元素(例如http://www.igs-ip.net:2101)定义前 2 个设置。

为了使这个可行,我想在点击第三个设置时验证网络连接。到目前为止,我能够捕捉到动态填充 ListPreference 的点击:

ListPreferenceDynamic dlp = (ListPreferenceDynamic)findPreference(strKey);
dlp.setOnClickListner(new ListPreferenceDynamicOnClickListener() 
{
    public void onClick(ListPreferenceDynamic preference) 
    {
        String[] astr = astrOpenWebPageAndGetInfo(strAddress, strPort);

        if (astr != null)
        {                           
            preference.setEntries(astr);                    
            preference.setEntryValues(astr);
        }
    }
});

我现在的问题是找到一种方法来防止在出现问题时显示 ListPreference 对话框,比如说,互联网地址。我只想显示一个 Toast 来解释问题,而不显示一个空的 ListPreference 对话框。

4

2 回答 2

0

我实际上是在这之后。

但是 ChangeListener 在选择新值后触发,对吗?

所以它并没有真正取消我所追求的列表。

我确实找到了一个解决方案,它正在制作一个自定义 ListPreference 类并有条件地处理 onClick。这样,如果通过 setActive 方法将其设置为不活动,则单击该选项后列表将不会显示。

public class CustomListPreference extends ListPreference {

private boolean isActive;

public CustomListPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomListPreference(Context context) {
    super(context);
}

public void setActive(boolean isActive) {
    this.isActive = isActive;
}

public boolean getActive() {
    return this.isActive;
}

@Override
public void onClick() {
    if (isActive) super.onClick();
}
}
于 2021-10-26T10:47:25.087 回答
0

有点晚了,但可能对你们中的一些人仍然有用:

我认为 OnPreferenceChangeListener 可以处理这个问题。如果要接受新值,只需注册一个并返回 true,如果要取消单击,则返回 false:

yourPreference.setOnPreferenceChangeListener((preference, newValue) -> {

    if(condition){
        showToast();
        return false;        //cancel the click
    } 
    else return true;        //accept the click
});

参数newValue确定您偏好的新值。

于 2021-09-15T19:18:53.760 回答