最近项目遇到一个需求,就是将SwitchPreference调用setEnabled(false)时,当中的Switch控件的Enabled属性不受影响。通研究代码发现SwitchPreference继承于TwoStatePreference类,TwoStatePreference类继承于Preference类。在Preference类中存在一个setEnabledStateOnViews(View view,boolean enabled)方法:
/**
* Makes sure the view (and any children) get the enabled state changed.
*/
private void setEnabledStateOnViews(View v, boolean enabled) {
v.setEnabled(enabled);
if (v instanceof ViewGroup) {
final ViewGroup vg = (ViewGroup) v;
for (int i = vg.getChildCount() - 1; i >= 0; i--) {
setEnabledStateOnViews(vg.getChildAt(i), enabled);
}
}
}
方法很简单,就是通过递归来改变Preference中所有子控件的enabled属性,本来可以直接通过重新这个方法就实现,但是这个方法是private,所以无法再子类中重写该方法,接着看到Preference类中onBindView(View view)方法:
protected void onBindView(View view) {
final TextView titleView = (TextView) view.findViewById(com.android.internal.R.id.title);
if (titleView != null) {
final CharSequence title = getTitle();
if (!TextUtils.isEmpty(title)) {
titleView.setText(title);
titleView.setVisibility(View.VISIBLE);
} else {
titleView.setVisibility(View.GONE);
}
}