/* * Copyright 2013 Peng fei Pan * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package me.xiaopan.android.examples.widget; import android.graphics.Color; import me.xiaopan.android.examples.R; import me.xiaopan.easy.android.util.Colors; import me.xiaopan.easy.java.util.StringUtils; import android.content.Context; import android.content.res.TypedArray; import android.text.TextUtils.TruncateAt; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class Preference extends LinearLayout{ /** * 此类型会在选项的右边放置一个箭头 */ public static final int TYPE_NONE = 1; /** * 此类型会在选项的右边放置一个突起的按钮,按钮和视图本身都可以点击 */ public static final int TYPE_NEXT = 2; /** * 此类型会在选项的右边放置一个可以滑动切换选中状态的开关按钮 */ public static final int TYPE_TOGGLE = 3; private TextView titleText; private TextView space; private TextView subtitleText; private ImageButton nextImageButton; private ImageView arrowImage; private BaseSlidingToggleButton slidingToggleButton; private boolean init; private boolean clickSwitchToggleState = true; private OnClickListener onNextButtonClickListener; private OnClickListener onPreferenceClickListener; private BaseSlidingToggleButton.OnCheckedChanageListener onCheckedChanageListener; private int type; private boolean defaultChecked; public Preference(Context context) { super(context); init(null); } public Preference(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.Preference); init(typedArray); typedArray.recycle(); } private void init(TypedArray typedArray){ setGravity(Gravity.CENTER_VERTICAL); LinearLayout linearLayout = new LinearLayout(getContext()); linearLayout.setOrientation(LinearLayout.VERTICAL); linearLayout.setGravity(Gravity.CENTER_VERTICAL); //标题 titleText = new TextView(getContext()); titleText.setTextSize(TypedValue.COMPLEX_UNIT_PX, getContext().getResources().getDimension(R.dimen.base_textSize_default)); titleText.setTextColor(getContext().getResources().getColor(R.color.base_black)); titleText.setSingleLine(); titleText.setEllipsize(TruncateAt.MARQUEE); if(typedArray != null){ titleText.setText(typedArray.getString(R.styleable.Preference_title)); } linearLayout.addView(titleText); //间隔 space = new TextView(getContext()); linearLayout.addView(space, new LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 7)); //副标题 subtitleText = new TextView(getContext()); subtitleText.setTextSize(TypedValue.COMPLEX_UNIT_PX, getContext().getResources().getDimension(R.dimen.base_textSize_littleSmall)); subtitleText.setTextColor(getContext().getResources().getColor(R.color.base_gray_dark)); subtitleText.setSingleLine(); subtitleText.setEllipsize(TruncateAt.END); if(typedArray != null){ setSubtitle(typedArray.getString(R.styleable.Preference_subtitle)); }else{ setSubtitle(null); } linearLayout.addView(subtitleText); addView(linearLayout, new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1)); if(typedArray != null){ defaultChecked = typedArray.getBoolean(R.styleable.Preference_checked, defaultChecked); } //设置类型,会根据不同的类型在右边添加不同的视图 if(typedArray != null){ setType(typedArray.getInt(R.styleable.Preference_type, TYPE_NONE)); }else{ setType(TYPE_NONE); } //设置点击监听器 init = true; setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(type == TYPE_TOGGLE && isClickSwitchToggleState() && slidingToggleButton != null){ slidingToggleButton.toggle(); }else{ if(onPreferenceClickListener != null){ onPreferenceClickListener.onClick(v); } } } }); } @Override public void setOnClickListener(OnClickListener l) { if(init){ init = false; super.setOnClickListener(l); }else{ this.onPreferenceClickListener = l; } } @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); switch(type){ case TYPE_TOGGLE : slidingToggleButton.setEnabled(enabled); break; case TYPE_NEXT : nextImageButton.setEnabled(enabled); break; default : arrowImage.setEnabled(enabled); break; } } /** * 设置标题 * @param title 标题 */ public void setTitle(String title){ titleText.setText(title); } /** * 设置副标题 * @param subtitle 副标题 */ public void setSubtitle(String subtitle){ subtitleText.setText(subtitle); //刷新副标题 if(StringUtils.isNotEmpty((String) subtitleText.getText())){ subtitleText.setVisibility(View.VISIBLE); space.setVisibility(View.VISIBLE); }else{ subtitleText.setVisibility(View.GONE); space.setVisibility(View.GONE); } } /** * 获取类型 * @return 类型,取值为Preference.TYPE_NONE、Preference.TYPE_NEXT、Preference.TYPE_TOGGLE之一 */ public int getType() { return type; } /** * 设置类型 * @param type 类型,取值为Preference.TYPE_NONE、Preference.TYPE_NEXT、Preference.TYPE_TOGGLE之一 */ public void setType(int type) { if(this.type != type && (type == TYPE_NONE || type == TYPE_NEXT || type == TYPE_TOGGLE)){ //删除旧的视图 switch (this.type) { case TYPE_NONE: removeView(arrowImage); arrowImage = null; break; case TYPE_NEXT: removeView(nextImageButton); nextImageButton = null; break; case TYPE_TOGGLE: removeView(slidingToggleButton); slidingToggleButton = null; break; } //添加新的视图 switch (type) { case TYPE_NONE : //箭头 arrowImage = new ImageView(getContext()); arrowImage.setImageResource(R.drawable.ic_arrow_right); addView(arrowImage); break; case TYPE_NEXT : nextImageButton = new ImageButton(getContext()); nextImageButton.setBackgroundColor(Colors.TRANSPARENT); nextImageButton.setImageResource(R.drawable.selector_btn_preference_next); nextImageButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(onNextButtonClickListener != null){ onNextButtonClickListener.onClick(v); } } }); addView(nextImageButton, new LinearLayout.LayoutParams(50, LinearLayout.LayoutParams.WRAP_CONTENT)); break; case TYPE_TOGGLE : slidingToggleButton = new SlidingToggleButton(getContext()); slidingToggleButton.setOnCheckedChanageListener(new BaseSlidingToggleButton.OnCheckedChanageListener() { @Override public void onCheckedChanage(BaseSlidingToggleButton slidingToggleButton, boolean isOn) { if(onCheckedChanageListener != null){ onCheckedChanageListener.onCheckedChanage(slidingToggleButton, isOn); } } }); slidingToggleButton.setDefaultChecked(defaultChecked); slidingToggleButton.setLayoutParams(new LayoutParams(100, 50)); slidingToggleButton.setBackgroundColor(Color.RED); addView(slidingToggleButton); break; } this.type = type; } } /** * 判断是否选中 * @return 是否选中,只有当Type是toggle时才起作用 */ public boolean isChecked(){ return slidingToggleButton != null?slidingToggleButton.isChecked():false; } /** * 设置是否选中 * @param isChecked 是否选中,只有当Type是toggle时才起作用 */ public void setChecked(boolean isChecked){ if(slidingToggleButton != null){ slidingToggleButton.setChecked(isChecked); } } /** * 设置下一步按钮的点击监听器 * @param onNextButtonClickListener 下一步按钮的点击监听器 */ public void setOnNextButtonClickListener(OnClickListener onNextButtonClickListener) { this.onNextButtonClickListener = onNextButtonClickListener; } /** * 判断当类型为toggle的时候点击当前视图是否切换Toggle的选中状态 * @return 当类型为toggle的时候点击当前视图是否切换Toggle的选中状态 */ public boolean isClickSwitchToggleState() { return clickSwitchToggleState; } /** * 设置当类型为toggle的时候点击当前视图是否切换Toggle的选中状态 * @param clickSwitchToggleState 当类型为toggle的时候点击当前视图是否切换Toggle的选中状态 */ public void setClickSwitchToggleState(boolean clickSwitchToggleState) { this.clickSwitchToggleState = clickSwitchToggleState; } /** * 设置选中状态改变监听器 * @param onCheckedChanageListener */ public void setOnCheckedChanageListener( BaseSlidingToggleButton.OnCheckedChanageListener onCheckedChanageListener) { this.onCheckedChanageListener = onCheckedChanageListener; } }