Android基本控件-重要章节2

study_dayup 2016-05-04 10:34:16
各控件设置及属性
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)来设置坐标位置),所以设置全屏 。

...全文
185 回复 打赏 收藏 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

80,490

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧