您的位置:首页 > 其它

鱼鱼Chen之学写自己的apk(四)灵活使用EditText的hint属性以及使用自定义的美观AlertDialog

2015-04-22 20:30 519 查看
EditText应该也算是常用的组件了。不过我们这篇仅对hint属性做一些有意思的功能。

一般来说,未编辑的EditText有个提示,而编辑过后就消失。当然,你什么都没编辑的话,提示又会出现~

效果如下:








不会用手机做动图,将就一下。

一、关于EditText的hint实现方法

主布局如下 activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="vertical"
android:padding="8dp"
tools:context="com.dota.example.fishychenofeditanddialog.MainActivity" >

<EditText
android:id="@+id/editor01"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入用户名" />

<EditText
android:id="@+id/editor02"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入数字密码"
android:layout_below="@+id/editor01"
android:inputType="numberPassword"
android:maxLength="6" />
<TextView
android:id="@+id/textview_01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这只是个做测试的文本"
android:textSize="25sp"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"/>
</RelativeLayout>
这边都是很基本的,就不解释了。记得!在最外部布局加上

android:focusable="true"

android:focusableInTouchMode="true"

这两句让当前布局能获得焦点。

然后是主Activitiy

初始化
private void init() {
editor01 = (EditText) findViewById(R.id.editor01);
editor02 = (EditText) findViewById(R.id.editor02);
editor01.setOnFocusChangeListener(this);
editor02.setOnFocusChangeListener(this);
}
关键就在这儿
@Override
public void onFocusChange(View v, boolean hasFocus) {
((EditText) v).setHint("");
switch (v.getId()) {
case R.id.editor01:
if (editor01.getText().toString().equals("") && hasFocus == false) {
editor01.setHint(R.string.text_user);
}
break;
case R.id.editor02:
if (editor02.getText().toString().equals("") && hasFocus == false) {
editor02.setHint(R.string.text_passweord);
}
break;
}
}
这边简单说一下,点击对应EditText的时候会获得焦点,如果当时有一个有焦点,就会失去。那么都会触发焦点变化,此时hasFocus传入的是是否有焦点。当焦点变化时,设置提示为“”,并检测,如果此时没有写内容并且失去焦点,那么再显示提示。

二、关于自定义的AlertDialog



小火鸡,萌萌哒~~

还是先从布局说起,新建一个dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >

<ImageView
android:id="@+id/imageView_background"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="120dp"
android:adjustViewBounds="true"
android:background="@drawable/pokenmen" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="40dp"
android:background="@drawable/no255" />

<TextView
android:id="@+id/text_out"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView_background"
android:layout_alignParentLeft="true"
android:layout_marginBottom="100dp"
android:layout_marginLeft="80dp"
android:background="@drawable/background_text"
android:text="退出"
android:textColor="#ffbc53"
android:textSize="30sp"
android:textStyle="bold" />

<TextView
android:id="@+id/text_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/imageView_background"
android:layout_alignParentRight="true"
android:layout_marginBottom="100dp"
android:layout_marginRight="80dp"
android:background="@drawable/background_text"
android:text="取消"
android:textColor="#ffbc53"
android:textSize="30sp"
android:textStyle="bold" />

</RelativeLayout>
原谅我不会用Layer-list做出这样的效果(至少不是我要的)。这边记得将父布局的高设为wrap_content,还有就是文本的背景用shape.xml来写。别的没什么要注意的了。

到主Activity,重写onBackPressed方法。去掉super(因为这句话调用了父类的按下返回键会关掉Activity)。

然后,我们这么写。
@Override
public void onBackPressed() {
final AlertDialog dialog=new AlertDialog.Builder(this).create();
dialog.show();
dialog.setContentView(R.layout.dialog_layout);
dialog.setCancelable(false);
TextView btnOut=(TextView) dialog.findViewById(R.id.text_out);
TextView btnCancel=(TextView) dialog.findViewById(R.id.text_cancel);
btnOut.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
finish();
}
});
btnCancel.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
dialog.cancel();
}
});
}
其实,写下来很简单的。先用AlertDialog.Builder类的create方法创建实例。再用setcontentView设置布局,setCancelable设置是否可以通过按返回关闭。dialog.cancel用来关闭对话框。这边一定要注意!!创建好了dialog之后,要先调用show方法,才能重新设置自定义的布局。不然会报错!

下面是个正常的调用系统的布局的写法,方便对比。(此时使用的是AlertDialog.Builder类的对象,并非是AlertDialog的对象,要注意!)
AlertDialog.Builder dialog2=new AlertDialog.Builder(this);
dialog2.setCancelable(false);
dialog2.setTitle("标题");
dialog2.setMessage("这是内容信息");
dialog2.setPositiveButton("确认按钮", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
dialog2.setNegativeButton("取消按钮", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
都用text表示出每句的意思了,就不一一解释了。

并不复杂的两个知识点,但是用起来很舒服,还能使你的应用增色不少~

完整的代码(百度云链接):http://pan.baidu.com/s/1dDjKcLj
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐