简体   繁体   English

onPreferenceClick侦听器不起作用/ onPreferenceClick不被调用

[英]onPreferenceClick listener not working / onPreferenceClick not being called

I am trying to open a website when one of my preferences is clicked (not when the preference is actually changed because there isn't one). 我试图在单击我的一个首选项时打开一个网站(不是因为没有一个而实际上更改了首选项),所以我想打开一个网站。

The problem is that the onPreferenceClick() is never called. 问题是永远不会调用onPreferenceClick()

This is my PreferenceActivity : 这是我的PreferenceActivity

public class About extends PreferenceActivity implements
        OnPreferenceClickListener {

TextView tv_developer;
TextView tv_version;
String versionName;

int counter = 0;

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

        addPreferencesFromResource(R.xml.about);        

        Preference p_developer = (Preference) findPreference("p_developer");
        p_developer.setOnPreferenceClickListener(this);

        Preference p_licences = (Preference) findPreference("p_licences");
        p_licences.setOnPreferenceClickListener(this);



    }

    @Override
    public boolean onPreferenceClick(Preference pref) {
        // TODO Auto-generated method stub

        Log.i("Anything pressed", "YES");
        if (pref.getKey().equals("p_developer")) {
            Log.i("p_developer", "YES");


        } else {
            Log.i("p_developer", "NO");
        }
        return true;
    }   
}

This is the xml: 这是xml:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="about"
    android:title="About" >


    <Preference
        style="?android:preferenceInformationStyle"
        android:key="p_licences"
        android:title="p_licences" />

    <PreferenceCategory android:title="Category" >

        <Preference
            style="?android:preferenceInformationStyle"
            android:key="p_developer"
            android:title="p_developer" />

    </PreferenceCategory>

</PreferenceScreen>

I have also found that this does not do anything either: 我还发现这也不起作用:

<Preference android:title="@string/prefs_web_page" >
    <intent android:action="android.intent.action.VIEW"
            android:data="http://www.example.com" />
</Preference>

Add android:enabled="true" to Preference : android:enabled="true"Preference

<Preference
    style="?android:preferenceInformationStyle"
    android:key="p2"
    android:enabled="true"
    android:title="p2" />

You are using: 您正在使用:

 PreferenceActivity.addPreferencesFromResource(R.layout.about);

Shouldn't it be more like: 它不应该更像是:

 PreferenceActivity.addPreferencesFromResource(R.xml.yourxmlfilename);

Since thae preferences you defined are not a layout. 由于您定义的首选项不是布局。 You need to load the name of the .xml file , not the key of the preference in .xml. 您需要加载.xml文件的名称 ,而不是.xml中首选项的键。

So, put your preferences .xml file in the "xml" folder , and give it a name like "mypreferences.xml". 因此, 将您的首选项.xml文件放在“ xml”文件夹中 ,并为其命名,例如“ mypreferences.xml”。 Then, load it like that: 然后,像这样加载它:

PreferenceActivity.addPreferencesFromResource(R.xml.mypreferences);

In my project, the file looks like this: (name "settings.xml") 在我的项目中,文件如下所示:( 名称为“ settings.xml”)

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory android:title="Your Settings" >
            <Preference
            android:key="delete"
            android:title="Delete User"
            android:summary="Deletes the user." />

      <!-- and so on -->

I add it to the PreferenceActivity by calling: 我通过调用将其添加到PreferenceActivity中:

PreferenceActivity.addPreferencesFromResource(R.xml.settings);

And set the onClickListener: 设置onClickListener:

Preference deletePref = (Preference) findPreference("delete");
        deletePref.setOnPreferenceClickListener(new OnPreferenceClickListener() {

            @Override
            public boolean onPreferenceClick(Preference preference) {
                // do stuff
                return true;
            }
        });

And it works. 而且有效。

Furthermore, you could try using a different name for title and key. 此外,您可以尝试使用其他名称作为标题和键。

Fresh answer here. 这里的新答案。

You need to declare listener first. 您需要先声明监听器。 And then attach that listener for each(!) of end Preference objects. 然后为最终首选项对象的每个(!)附加该侦听器。 Like these: 像这些:

    final static int CAMERA_SLEEP_TIME=0,
                CAMERA_TIME=1,
                RESET=2;

private Preference.OnPreferenceClickListener listener =new Preference.OnPreferenceClickListener(){
    @Override
    public boolean onPreferenceClick(Preference preference) {
        String keyLcl = preference.getKey();
       if(keyLcl.equals(cameraSleepTime))
           triggerPrefsDialog(CAMERA_SLEEP_TIME);
        else
       if (keyLcl.equals(cameraTime))
           triggerPrefsDialog(CAMERA_TIME);
        else
       if (keyLcl.equals(reset))
           triggerPrefsDialog(RESET);
        else
       return false;
        return true;

    }


};
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.preferences);
    Resources resLcl = getResources();
    cameraSleepTime=resLcl.getString(R.string.camera_sleep_time);
    cameraTime=resLcl.getString(R.string.camera_time);
    reset =resLcl.getString(R.string.reset);
    PreferenceScreen sceenLcl = getPreferenceScreen();
    PreferenceCategory pcLcl=(PreferenceCategory)sceenLcl.getPreference(1);
    pcLcl.getPreference(0).setOnPreferenceClickListener(listener);
    pcLcl.getPreference(1).setOnPreferenceClickListener(listener);
    pcLcl=(PreferenceCategory)sceenLcl.getPreference(2);
    pcLcl.getPreference(0).setOnPreferenceClickListener(listener);
    l.a(pcLcl.getTitle());
}

And related preferences.xml: 以及相关的preferences.xml:

<?xml version="1.0" encoding="utf-8"?>

<PreferenceCategory

    android:title="@string/switch_mode">

    <CheckBoxPreference
        android:key="@string/enable_switch"
        android:defaultValue="true"
        android:gravity="center"
        android:title="@string/is_switched"

        />
</PreferenceCategory>
<PreferenceCategory

    android:title="@string/seconds_category">
    <Preference
        android:key="@string/camera_time"

        android:defaultValue="600000"
        android:title="@string/camera_time"
        />
    <Preference
        android:key="@string/camera_sleep_time"
        android:defaultValue="600000"
        android:title="@string/camera_sleep_time"
        />
</PreferenceCategory>
<PreferenceCategory
    android:title="@string/System">
    <Preference
        android:key="@string/reset"
        android:defaultValue="false"
        android:title="@string/reset"
        />
</PreferenceCategory>
<PreferenceCategory
    android:title="@string/to_be_added">
</PreferenceCategory>

For me the solution was to extend the existing PreferenceCategory class (in Support Library) and override isEnabled() . 对我来说,解决方案是扩展现有的PreferenceCategory类(在支持库中)并重写isEnabled() This method always returned false so I created a class called ClickablePreferenceCategory and changed it to true . 此方法始终返回false因此我创建了一个名为ClickablePreferenceCategory的类,并将其更改为true

In addition to that I had to add android:selectable="true" to my custom Preference xml node. 除此之外,我还必须将android:selectable="true"到我的自定义首选项xml节点中。 The result looks like this: 结果看起来像这样:

<PreferenceCategory
    android:enabled="true"
    android:key="@string/key_category_problem_solving"
    android:selectable="true"
    android:title="@string/problem_solving">

</PreferenceCategory>

And the ClickablePreferenceCategory : ClickablePreferenceCategory

public class ClickablePreferenceCategory extends PreferenceCategory {

    public ClickablePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public ClickablePreferenceCategory(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

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

    @Override
    public boolean isEnabled() {
        return true;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM