android中可以通过继承LinearLayout来实现自定义控件,今天写了一个EditText和ImageView结合的自定义控件:
首先是控件的基本布局
这是自定义控件的实现主代码
/**
* Created by ukfire on 15-7-13.
*/
public class MyEditText extends LinearLayout implements View.OnClickListener {
private ImageView left;
private EditText edit;
private ImageView right;
private LinearLayout view;
public MyEditText(Context context) {
super(context);
init();
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyView);
float textSize = ta.getDimension(R.styleable.MyView_textSize, 18);
edit.setTextSize(textSize);
ta.recycle();
}
public void init() {
view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.keke_edittext, this, true);
view.setBackgroundResource(R.drawable.normalborder);
left = (ImageView) view.findViewById(R.id.LeftImageView);
edit = (EditText) view.findViewById(R.id.MyEditText);
right = (ImageView) view.findViewById(R.id.RightImageButton);
right.setVisibility(View.GONE);
right.setOnClickListener(this);
edit.addTextChangedListener(mTextWatcher);
edit.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
view.setBackgroundResource(R.drawable.activeborder);
if (edit.getText().toString().length() != 0)
right.setVisibility(View.VISIBLE);
} else {
view.setBackgroundResource(R.drawable.normalborder);
right.setVisibility(View.GONE);
}
}
});
}
TextWatcher mTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
ErKe(s);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
ErKe(s);
}
@Override
public void afterTextChanged(Editable s) {
if (s.length() == 0)
right.setVisibility(view.GONE);
}
private void ErKe(CharSequence s) {
if (s.length() != 0)
right.setVisibility(View.VISIBLE);
else
right.setVisibility(View.GONE);
}
};
public void setLeftImageView(int resId) {
left.setImageResource(resId);
}
public void setRightImageButton(int resId) {
right.setImageResource(resId);
right.setVisibility(View.GONE);
}
public void setHint(String s) {
edit.setHint(s);
}
public String getText() {
return edit.getText().toString();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.RightImageButton:
edit.setText("");
right.setVisibility(View.GONE);
break;
default:
break;
}
}
}
接下来是调用这个控件
在主界面设置自己想要的样式
public class MainActivity extends Activity {
private MyEditText myEditText;
private MyEditText myEditText1;
private MyEditText myEditText2;
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myEditText = (MyEditText) findViewById(R.id.myEdit);
myEditText1 = (MyEditText) findViewById(R.id.myEdit1);
myEditText2 = (MyEditText) findViewById(R.id.myEdit2);
myEditText.setLeftImageView(R.drawable.people);
myEditText.setRightImageButton(R.drawable.delete);
myEditText.setHint("用户名");
myEditText1.setRightImageButton(R.drawable.delete);
myEditText1.setHint("用户名");
myEditText2.setLeftImageView(R.drawable.search);
myEditText2.setHint("搜索");
}
}
效果图如下: