2010-08-25 16 views
10

Uygulamamdaki belirli durumlar sırasında, ayar menüsümde belirli CheckBoxPreferences'ı devre dışı bırakmak istiyorum. Ancak, kullanıcı bunları tıklarsa, açıklayıcı bir tost gösterilmesini istiyorum. Ben sadece setEnable (false) yaparsam; CheckBoxPreference üzerinde, doğru görünüm ve his elde ediyorum. Ama tıklamayla gösterilecek bir tost alamıyorum. Öte yandan, CheckBoxPreference'ın el ile devre dışı bırakılmış gibi görünmesini sağlayamadım.Make Preference (Görünüm Tercihi) devre dışı bırakıldı, ancak yine de tıklamaları kaydetmeye devam ediyor

cevap

18

Tercihi devre dışı bırakmak yerine, yalnızca tercihlerin görünümlerini devre dışı bırakabilirsiniz.

Tercihiniz devre dışı olsa bile
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

yaratıcı ve düzgün bir çözüm, teşekkür ederim! – pgsandstrom

0

, sen OnTouchEvents alabilir:

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

    ... 
} 
İlgili konular