TextInputLayout 作爲一個父容器,包裝了 EditText。通常單獨使用 EditText 時,使用 hint 定義的提示信息會隨着用戶輸入的第一個數據開始,就自動隱藏了;而使用用 TextInputLayout 包裹的 EditText 時,就不會出現這種現象。同時也可以給 EditText 增加監聽事件。其中的一些參數如代碼中註釋。
效果如下:
其中的提示信息的顏色是 styles.xml 中的 colorAccent。
當然首先得添加支持庫(design:23.1.1 可修改):
content_main.xml :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="horizontal"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.crazy.androiddesigntest.MainActivity"
tools:showIn="@layout/activity_main">
<android.support.design.widget.TextInputLayout
android:id="@+id/textInputLayout"
android:layout_weight="9"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:hint="輸入的數從0開始計數"
android:ellipsize="start"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.TextInputLayout>
<Button
android:id="@+id/button"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="確定"/>
</LinearLayout>
MainActivity.java :
package com.crazy.androiddesigntest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
final TextInputLayout textInputLayout = (TextInputLayout)findViewById(R.id.textInputLayout);
EditText editText = textInputLayout.getEditText();
button = (Button)findViewById(R.id.button);
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (s.length() > 5) {
// 提示出錯(如果不修改錯誤,則提示不會消失)
// 注意:s.length()是長度值,如果正確輸入時 start==5 也不會報錯;
// 但是當 start==5 時刪除一個數據就會出現提示的錯誤信息
textInputLayout.setError("超出範圍了!!");
// 顯示出錯提示
textInputLayout.setErrorEnabled(true);
} else {
textInputLayout.setErrorEnabled(false);
}
}
/**
*
* @param s 字符序列
* @param start 開始的位置,從 0 開始
* @param before 刪除時 before 從 0 變爲 1
* @param count 輸入正確時該值爲 1,刪除時,該值爲 0
*/
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (start == 0 && count == 1 && s.length() <= 5) {
Toast.makeText(MainActivity.this, "您已經開始輸入信息了!", Toast.LENGTH_SHORT).show();
}
if (before == 1 && start != 0 && s.length() <= 5) {
Toast.makeText(MainActivity.this, "您正在更正信息!", Toast.LENGTH_SHORT).show();
}
if (start == 0 && count == 0 && s.length() <= 5) {
Toast.makeText(MainActivity.this, "您要從頭開始重新輸入!", Toast.LENGTH_SHORT).show();
return;
}
if (count == 1 && start != 0 && s.length() <= 5) {
Toast.makeText(MainActivity.this, "您正在輸入!", Toast.LENGTH_SHORT).show();
}
}
@Override
public void afterTextChanged(Editable s) {
buttonClick(s);
}
});
}
private void buttonClick(final Editable s){
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
alertDialog.setTitle("確認信息");
alertDialog.setIcon(R.drawable.tools);
alertDialog.setMessage("您輸入的信息爲:" + s.toString());
// 爲 AlertDialog.Builder 添加確定按鈕
setPositiveButton(alertDialog);
// 爲 AlertDialog.Builder 添加取消按鈕
setNegativeButton(alertDialog, s);
alertDialog.create().show();
}
});
}
private AlertDialog.Builder setPositiveButton(AlertDialog.Builder alertDialog) {
// 調用 setPositiveButton 方法添加“確定”按鈕
return alertDialog.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
private AlertDialog.Builder setNegativeButton(AlertDialog.Builder alertDialog,
final Editable s){
// 調用 setPositiveButton 方法添加“取消”按鈕
return alertDialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
s.clear();
Toast.makeText(MainActivity.this, "您已經取消", Toast.LENGTH_LONG).show();
}
});
}
}
SecondActivity.java :
package com.crazy.androiddesigntest;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;
/**
* Created by antimage on 2015/12/20.
*/
public class SecondActivity extends Activity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setGravity(Gravity.CENTER);
textView.setText("歡迎來到我的世界!");
textView.setTextSize(30);
textView.setTextColor(Color.RED);
setContentView(textView);
}
}
不要忘了在 AndroidManifest.xml 中爲 SecondeActivity 註冊:
<activity android:name=".SecondActivity" />