2010-08-25 67 views
10

因此,在我的應用程序的某些州,我想禁用我的設置菜單中的某些CheckBoxPreferences。但是,如果用戶點擊它們,我想要顯示說明性的敬酒。如果我只是做setEnable(false);在CheckBoxPreference上,我確實擁有正確的外觀和感覺。但我不能得到一個吐司點擊顯示。另一方面,我沒有手動使CheckBoxPreference看起來像它被禁用。使首選項看起來禁用,但仍然註冊點擊

回答

18

除了禁用首選項外,還可以僅禁用首選項的視圖。

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

創意和巧妙的解決辦法,謝謝! – pgsandstrom 2010-08-25 15:14:10

0

即使您希望禁用,則可以收到OnTouchEvents:

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

    ... 
} 
相關問題