Android基本控件-重要章节2
各控件设置及属性
View是所有控件和布局的基类(都具有Enabled属性)
Button继承于TextView,具有TextVeiw的所有属性(例:android:clickable="true")
EditText为TextView的子类
EditText的特有属性:
android:autoText控制字段是否提供拼写辅助
android:digits指定字段只接受某些数字
android:hint输入为空时的提示
android:singLine控制字段是单行输入还是多行输入(即点击Enter是换行还是焦点移动到下一控件)
颜色RGB为十六进制整数即0-f之间(代码中表示十六进制加0x)
在代码中设置颜色时两种方式:
通过资源文件setTextColor(R.color.颜色名称);
setTextColor(0xecdf);
静态设置字体样式:android:textStyle=“bold”
代码中设置字体样式:setTypeface(Typeface.Default)默认、加粗bold、斜体italic
当输入用户名和密码时按钮再获取焦点
思路:
设置Button为失去焦点 btn.setEnabled (false);
调用EditText的addTextChangedListener();实现接口,在接口的onTextChanged方法中判断输入框是否有内容来设置焦点的有无。
对Button的焦点事件做了处理,然后给Button设置点击事件
代码实现:
btn.setEnabled(false);
et.addTextChangedListener(new TextWatcher){
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
//s就是输入框中的内容
if(s.length()!=0){
btn.setEnabled(true);
}else{
btn.setEnabled(false);
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
}
return的两种用法:(用户提交完成信息界面自动关闭,提交失败则继续完成信息)
方法1:用在有返回值的方法中,用来方法指定类型的值,同时结束方法的执行。
方法2:用在返回值为void的方法中,用来终止方法的执行
例:
public void onClick(View v) {
name = et.getText().toString().trim();
// 判断字符串是否为空
if (name.length()==0) {
//信息为空
tv.setText("姓名不能为空");
return;//执行完此句会直接跳出onClick方法
}else{
//信息提交完成
}
// 将自身窗体关闭
finish();
}
为EditText控件设置可选择的字体样式
思路:
用CheckBox设置好字体的几种样式(斜体、粗体)
在代码中写实现OnCheckChangedListener的内部类 ,添加未实现的onCheckedChanged方法
然后在onCheckedChanged方法用switch判断哪个CheckBox被点击,在分支中进一步判断CheckBox是否被选中
若CheckBox被选中,有什么变化,不选中时,又有什么变化(字体样式为整形,所以可以定义int型对其操作)
***最后一步注意创建监听类的实例并引用
代码如下:
private int style;
class onCheckedChanger implements OnCheckedChangedListener{
public void onCheckedChanged(CompoundButton ButtonView,boolean isChecked){
switch(ButtonView.getId()){
case R.id.checkbox1:
if(isChecked){//粗体
style+=Typeface.BOLD;
}esle{
style-=Typeface.BOLD;
}
break;
case R.id.checkbox2://斜体
if(isChecked){//粗体
style+=Typeface.ITALIC;
}esle{
style-=Typeface.ITALIC;
}
break;
default:
break;
}
et.setTypeface(Typeface.DEFAULT, style);
}
}
***在onCreate方法中引用此类
onCheckedChanger Listener =new onCheckedChanger ();
ck_bold.setOnCheckedChangerListener(Listener );
ck_italic.setOnCheckedChangerListener(Listener );
一个RadioGroup 单选按钮组的使用
注意:虽然CheckBox和RadioGroup都有点击事件方法名一样,但是接口不一样
CheckBox监听事件实现的CompoundButton类,而RadioGroup监听事件实现的RadioGroup类
代码如下:
private int money=0;
rg.setOnCheckedChangedListener(new OnCheckedChangedListener(){
public void onCheckedChanged(RadioGroup group,int checkedId){
//红色部分也可用于按钮的点击事件中
int id=rg.getCheckedRadioButtonId();//由参数Group中获取被选中按钮id或者用RadioGroup的变量名(全局变量)
switch(id){
case R.id.radio0:
money=50;
break;
case R.id.radio1:
money=100;
break;
case R.id.radio2:
money=100;
break;
}
tv.setText("您当前的充值金额为"+money);
}
});
多个RadioGroup 单选按钮组的使用
思路:把对多组按钮的监听写到一个内部类,先确定是点击的那个RadioGroup,然后在确定RadioGroup中的哪个
按钮被选中,对应设置需要的功能
代码如下:
private String music=“开”;
private String voice=“关”;
private String phone=“机型一”;
class onCheckedChanger implements OnCheckChangeListener{
public void onCheckedChanged(RadioGroup group,int checkedId){
//radioGroup与radio的对应
switch(group.getId()){
case R.id.radioGroup1:
if(checkedId==R.id.music_open){
music="开";
}else{
music="关";
}
break;
case R.id.radioGroup2:
if(checkedId==R.id.voice_open){
voice="开";
}else{
voice="关";
}
break;
case R.id.radioGroup3:
switch (checkedId){
case R.id.radio0:
phone="机型一";
break;
case R.id.radio1:
phone="机型二";
break;
case R.id.radio2:
phone="机型三";
break;
default:
break;
}
break;
default:
break;
}
若在TextView中设置自己的设置信息可以用StringBuffer
StringBuffer sb=new StringBuffer();
sb.append("音乐"+music+“音效”+voice+“机型”+phone);
tv.setText(sb);
//以上为tv设置内容灵活运用,也可用到其他按钮中
}
}
设置三个RadionGroup监听方法
onCheckedChanger listener=new onCheckedChanger ();
rg1.setOnCheckedChangedListener(listener);
rg2.setOnCheckedChangedListener(listener);
rg3.setOnCheckedChangedListener(listener);
简单触屏事件:
MotionEvent处理运动事件的一个类,通过getAction()可以获得动作类型,getX(),getY()获得坐标
代码如下:
public Boolean onTouchEvent(MotionEvent event){
if(event.getAction()==MotionEvent.ACTION_DOWN){
//按下
//得到横纵坐标
float x=event.getX();
float y=event.getY();
}else if(event.getAction()==MotionEvent.ACTION_UP){
//弹起
}else{
//移动
}
}
简单键盘事件:(与触屏类似)
//三种状态按下、弹起、长按
et.setOnKeyListener(new OnKeyListener(){
public boolean onKey(View v,int keyCode,KeyEvent event){
if(event.getAction()==KeyEvent .ACTION_DOWN){
//按下
}
//键盘输入是否为1
if(keyCode==KeyEvent .KeyCODE_1){
}
}
});
实现按两次返回键才能退出程序(通过记录按键时间计算时间差实现)
long exitTime=0;
public boolean onKeyDown(int keyCode , KeyEvent event){
if(keyCode==KeyEvent. KEYCODE_BACK){
if((System.CurrentTimeMillis()-exitTime)>2000){
Toast.makeText(getApplicationContext(),"再按一次退出程序",Toast.LENGTH_SHORT).show();
exitTime=System.CurrentTimeMillis();
} else{
finish();
System.exit(0);
}
}
return super.onKeyDown(keyCode,event);
}
使用触屏事件来完成图片的更改(即图片随鼠标位置移动,用到自定义View)
//自定义Veiw
public class GameView extends View{
//若触屏坐标为(0,0)则会只显示半块图片
private int phoneX=150;//0
private int phoneY=300;//0
private int bmpWidth;
private int bmpHeight;
//若无图片则会报空指针异常(设为null)
private Bitmap bitmap=null;
//继承View的构造方法(用来初始化所需内容)
public GameView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取图片资源
bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
//获取图片宽、高
bmpWidth=bitmap.getWidth();
bmpHeight=bitmap.getHeight();
}
//图片宽高的getter、setter方法
public int getPhoneX() {
return phoneX;
}
public void setPhoneX(int phoneX) {
this.phoneX = phoneX;
}
public int getPhoneY() {
return phoneY;
}
public void setPhoneY(int phoneY) {
this.phoneY = phoneY;
}
//继承View的onDraw方法,当View呈现时自动调用(静态绘制)
@Override
protected void onDraw(Canvas canvas) {
//将图片设置到画布上 (直接使用的图片,所以参4画笔为null)
canvas.drawBitmap(bitmap, phoneX-bmpWidth/2, phoneY-bmpHeight/2, null);
super.onDraw(canvas);
}
}
以上类写好之后 在控件布局的最下栏Custom...中找到GameView控件拖到布局中使用
在主类中写onTouchEvent 事件获取当前位置对图片进行位置更改
public class MainActivity extends Activity{
private GameView gameView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 去掉标题栏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.fragment_main);
//得到当前窗体,设置满屏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSC REEN);
gameView=(GameView) findViewById(R.id.gameView1);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float x=event.getX();
float y=event.getY();
gameView.setPhoneX((int)x);
gameView.setPhoneY((int)y);
Log.i("Test", x+"");
//使用 invalidate对onDraw方法进行刷新
gameView.invalidate();
return super.onTouchEvent(event);
}
}
注意:若有标题栏,触屏时会感到鼠标和图片距离有偏差(鼠标是以Activity的(0,0)开始的,
而图片是以View的(0,0)来设置坐标位置),所以设置全屏 。