Это решение является немного рискованным, потому что оно делает предположения о суперкласс PreferenceFragment (используя ListView и используя android.R.id.list id).
Я попробовал другой подход установки OnLongClickListener в представлении Pref, но это сделало флажок незаметным, и я не смог найти способ исправить это. Так что это лучшее решение, которое я имею до сих пор.
public class MyPreferenceFragment extends PreferenceFragment implements OnItemLongClickListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
setPreferenceScreen(root);
CheckBoxPreference pref = new LongClickableCheckBoxPreference(getActivity()) {
@Override
public boolean onLongClick(View v) {
// YAY! you long-clicked me :)
return true;
}
};
// configure the pref here
root.addPreference(pref);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View result = super.onCreateView(inflater, container, savedInstanceState);
if (result != null) {
View lv = result.findViewById (android.R.id.list);
if (lv instanceof ListView) {
((ListView)lv).setOnItemLongClickListener(this);
}
else {
// oh noes! it looks like this PreferenceFragment does not use the standard id for listviews
}
}
return result;
}
private static abstract class LongClickableCheckBoxPreference extends CheckBoxPreference implements View.OnLongClickListener {
public LongClickableCheckBoxPreference(Context context) {
super(context);
}
}
}