2010-08-25 5 views
10

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

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

kreative und saubere Lösung, danke! – pgsandstrom

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; 
    } 

    ... 
} 
Verwandte Themen