So während bestimmter Zustände in meiner App, ich möchte bestimmte CheckBoxPreferences in meinem Einstellungsmenü deaktivieren. Wenn der Benutzer sie jedoch anklickt, möchte ich einen erläuternden Toast anzeigen. Wenn ich nur setEnable (false); Auf der CheckBoxPreference bekomme ich das richtige Aussehen und Gefühl. Aber ich kann keinen Toast bekommen, der beim Klicken angezeigt wird. Auf der anderen Seite habe ich es versäumt, CheckBoxPreference so aussehen zu lassen, als ob sie deaktiviert wäre.Lassen Präferenz aussehen deaktiviert, aber immer noch Klicks registrieren
10
A
Antwort
18
Anstatt die Einstellung zu deaktivieren, können Sie auch nur die Ansichten der Einstellung deaktivieren.
public class DisabledAppearanceCheckboxPreference extends CheckBoxPreference {
protected boolean mEnabledAppearance = false;
public DisabledAppearanceCheckboxPreference(Context context,
AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
boolean viewEnabled = isEnabled()&&mEnabledAppearance;
enableView(view, viewEnabled);
}
protected void enableView(View view, boolean enabled){
view.setEnabled(enabled);
if (view instanceof ViewGroup){
ViewGroup grp = (ViewGroup)view;
for (int index = 0; index < grp.getChildCount(); index++)
enableView(grp.getChildAt(index), enabled);
}
}
public void setEnabledAppearance(boolean enabled){
mEnabledAppearance = enabled;
notifyChanged();
}
@Override
protected void onClick() {
if (mEnabledAppearance)
super.onClick();
else{
// show your toast here
}
}
}
0
Auch wenn Ihre Präferenz deaktiviert, Sie OnTouchEvents empfangen können:
public class MyPreferenceFragment extends PreferenceFragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState);
final ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
int position = listView.pointToPosition((int) event.getX(), (int) event.getY());
ListAdapter adapter = listView.getAdapter();
Preference preference = (Preference) adapter.getItem(position);
if (!preference.isEnabled())
Toast.makeText(getActivity(), "Sorry, this setting is not available!", Toast.LENGTH_LONG).show();
return false;
}
});
return view;
}
...
}
kreative und saubere Lösung, danke! – pgsandstrom