精华内容
下载资源
问答
  • Android Studio 的原生输入框控件 EditText 属性配置详解 文本设置 android:hint="默认文本设置" android:textColorHint="#95A1AA" // 默认文本颜色 android:textColorHighlight=“#666666” // 文字选中颜色 ...

    Android Studio 的原生输入框控件 EditText 属性配置详解

    文本设置

    android:hint="默认文本设置"
    android:textColorHint="#95A1AA" // 默认文本颜色
    android:textColorHighlight=“#666666” // 文字选中颜色
    android:selectAllOnFocus="true" // 获取焦点后是否全选文本内容
    android:textScaleX="1.5" // 设置字与字的水平间隔
    android:textScaleY="1.5" // 设置字与字的垂直间隔
    android:capitalize 默认none,提供了三个可选值:
    	sentences:仅第一个字母大写
    	words:每一个单词首字母大小,用空格区分单词
    	characters:每一个英文字母都大写
    android:paddingTop="5dp" // 文字与组件边框的距离
    

    文本类型

    android:inputType="none" <!--无格式-->
    android:inputType="phone" <!--拨号键盘-->
    android:inputType="text" <!--文本格式-->
    android:inputType="textAutoComplete" <!--自动完成-->
    android:inputType="textAutoCorrect" <!--纠正单词的拼写错误-->
    android:inputType="textCapCharacters" <!--所有字符大写-->
    android:inputType="textCapSentences" <!--仅第一个字母大写-->
    android:inputType="textCapWords" <!--单词首字母大写-->
    android:inputType="textEmailAddress" <!--电子邮件地址格式-->
    android:inputType="textEmailSubject" <!--邮件主题格式-->
    android:inputType="textFilter" <!--文本筛选格式-->
    android:inputType="textImeMultiLine" <!--输入法多行-->
    android:inputType="textLongMessage" <!--长消息格式-->
    android:inputType="textMultiLine" <!--多行输入-->
    android:inputType="textNoSuggestions" <!--不提示-->
    android:inputType="textPassword" <!--密码格式-->
    android:inputType="textPersonName" <!--人名格式-->
    android:inputType="textPhonetic" <!--拼音输入格式-->
    android:inputType="textPostalAddress" <!--邮政格式-->
    android:inputType="textShortMessage" <!--短消息格式-->
    android:inputType="textUri" <!--URI格式-->
    android:inputType="textVisiblePassword" <!--密码可见格式-->
    android:inputType="textWebEditText" <!--作为网页表单的文本格式-->
    android:inputType="textWebEmailAddress" <!--作为网页表单的电子邮件地址格式-->
    android:inputType="textWebPassword" <!--作为网页表单的密码格式-->
    

    数值类型

    android:inputType="numberPassword" <!--数字密码格式-->
    android:inputType="numberSigned" <!--有符号数字格式-->
    android:inputType="number" <!--数字格式-->
    android:inputType="numberDecimal" <!--可以带小数点的浮点格式-->
    android:inputType="phone" <!--拨号键盘-->
    android:inputType="datetime" <!--日期-->
    android:inputType="date" <!--日期-->
    android:inputType="time" <!--时间-->
    

    行数设置

    android:minLines="3" // 最小行数
    android:maxLines="3" // 最大行数
    android:singleLine="true" // 设置只允许单行输入,而且不会滚动
    

    改变输入法中回车按钮的显示内容

    android:imeOptions="actionNone"
    <!--imeOptions有下面一些常用值-->
    <!--actionUnspecified未指定,对应常量EditorInfo.IME_ACTION_UNSPECIFIED;-->
    <!--actionNone 没有动作,对应常量EditorInfo.IME_ACTION_NONE;-->
    <!--actionGo执行 “开始” ,对应常量EditorInfo.IME_ACTION_GO;-->
    <!--actionSearch 执行 “搜索”,对应常量EditorInfo.IME_ACTION_SEARCH;-->
    <!--actionSend执行 “发送”,对应常量EditorInfo.IME_ACTION_SEND;-->
    <!--actionNext 执行 “下一个”,对应常量EditorInfo.IME_ACTION_NEXT;-->
    <!--actionPrevious 执行 “上一个”,对应常量IME_ACTION_PREVIOUS;-->
    <!--actionDone 执行 “完成”,对应常量EditorInfo.IME_ACTION_DONE-->
    

    其他属性设置

    android:numeric="integer" <!--设置仅仅能输入整数,假设是小数则是:decimal-->
    android:password="true" <!--设置仅仅能输入密码-->
    android:textColor="#ff8c00" <!--字体颜色-->
    android:textStyle="bold" <!--字体 bold, italic, bolditalic-->
    android:textSize="20dp" <!--设置输入文本内容字体大小-->
    android:textAlign="center" <!--EditText没有这个属性,但TextView有,居中-->
    android:typeface="monospace" <!--字型,normal, sans, serif, monospace (标准、无衬线字体、衬线字体、等宽字体)-->
    android:background="@null" <!--背景,这里设置null,意思为透明-->
    android:layout_weight="1" <!--权重,控制控件之间的地位,在控制控件显示的大小时蛮实用的-->
    android:cursorVisible="true" <!--设定光标为显示/隐藏,默认显示-->
    android:digits="1234567890" <!--设置允许输入哪些字符,如“1234567890.+-*/% ()”-->
    android:drawableRight="@drawable/xxx" <!--在EditText的右边输出一个drawable-->
    android:drawableTop="@drawable/xxx" <!--在EditText的正上方输出一个drawable-->
    android:drawableBottom="@drawable/xxx" <!--在EditText的下方输出一个drawable-->
    android:drawableLeft="@drawable/xxx" <!--在EditText的左边输出一个drawable-->
    android:drawablePadding <!--设置text与drawable(图片)的间隔,与drawableLeft、drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果-->
    android:editable="true" <!--设置是否可编辑,默认可以编辑-->
    android:ellipsize="start" <!--设置当文字过长时,该控件该怎样显示,例如设置以下值:"start"省略号显示在开头,"end"省略号显示在结尾,"middle"省略号显示在中间,"marquee"以跑马灯的方式显示(动画横向移动)-->
    android:gravity="center" <!--设置文本位置,如设置成"center",文本将居中显示-->
    

    修改光标的颜色和样式

    1、在 drawable 文件夹下新建一个 edit_cursor_color.xml 文件,写入 shape 标签,代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle">
        <size android:width="1dp" />
        <solid android:color="#000000" />
    </shape>
    

    2、在布局文件中引用 EditText 控件时设置:

    android:textCursorDrawable="@drawable/edit_cursor_color"
    

    为 EditText 配置边框线

    1、在 drawable 中写出一个边框线:textview_border.xml

     <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <item>
        <shape>
            <stroke android:width="0.5dp" android:color="#e1e1e1" /><!--边框颜色-->
            <solid android:color="#f8f8f8" /><!--填充色-->
            <corners android:radius="4dp" />
        </shape>
      </item>
    </layer-list>
    

    2、在需要配置的 EditText 加入 background 属性就好了

    设置 EditText 默认不聚焦

    在其父布局中添加:

    android:focusable="true"
    android:focusableInTouchMode="true"
    
    展开全文
  • 今天学习了自定义控件,然后自己做了一个用户登录小控件EditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,但是Android原生EditText不具备此功能,所以要想实现这一功能...

    今天学习了自定义控件,然后自己做了一个用户登录小控件EditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,但是Android原生EditText不具备此功能,所以要想实现这一功能我们需要重写EditText。

    先说明一下,我是用Android studio写的,代码已经共享到我的github上了,有需要的可以去下载。

    我们可以为我们的输入框在上下左右设置图片,所以我们可以利用属性android:drawableRight设置我们的删除小图标,如图

    这里设置了左边和右边的图片,如果我们能为右边的图片设置监听,点击右边的图片清除输入框的内容并隐藏删除图标,这样子这个小功能就迎刃而解了,可是 Android并没有给允许我们给右边小图标加监听的功能,这时候你是不是发现这条路走不通呢,其实不是,我们可能模拟点击事件,用输入框的的 onTouchEvent()方法来模拟,

    当我们触摸抬起(就是ACTION_UP的时候)的范围  水平方向大于输入框左侧到清除图标左侧的距离,小与输入框左侧到清除图片右侧的距离,在竖直方向大于输入框上顶部到清除图标上侧的距离,小于输入框下底部到清除图标的距离,我们则认为是点击清除图片,只要给清除小图标就上了监听,同时也给输入框设置了晃动效果,当没有输入账户时,点击登录,就会实现输入框的晃动。下面贴一下代码。(代码中有很详细的注释)

     

    package com.tony.clearedittext;
    
    import android.content.Context;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.util.AttributeSet;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.CycleInterpolator;
    import android.view.animation.TranslateAnimation;
    import android.widget.EditText;
    
    import java.util.jar.Attributes;
    
    /**
     * Created by Cheng Bao on 2015/6/17.
     */
    public class ClearEditText extends EditText implements View.OnFocusChangeListener,TextWatcher {
        /**
         * 删除按钮的引用
         */
        private Drawable mClearDrawable;
        private Context context;
    
        /**
         * 控件是否有焦点
         */
        private boolean hasFocus;
    
        public ClearEditText(Context context) {
            this(context,null);
    //        super(context);
    //        this.context = context;
    //        init();
        }
        public ClearEditText(Context context,AttributeSet attrs){
            //这里构造方法也很重要,不加这个很多属性不能再XML里面定义
            this(context, attrs, android.R.attr.editTextStyle);
        }
    
        public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            init();
        }
        private void init() {
            //获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
            mClearDrawable = getCompoundDrawables()[2];
            if (mClearDrawable == null) {
                mClearDrawable = getResources().getDrawable(R.drawable.delete_selector);
            }
            mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());
            //默认设置隐藏图标
            setClearIconVisible(false);
            //设置焦点改变的监听
            setOnFocusChangeListener(this);
            //设置输入框里面内容发生改变的监听
            addTextChangedListener(this);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            if (mClearDrawable != null && event.getAction() == MotionEvent.ACTION_UP) {
                int x = (int) event.getX();
                //判断触摸点是否在水平范围内
                boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight())) &&
                        (x < (getWidth() - getPaddingRight()));
                //获取删除图标的边界,返回一个Rect对象
                Rect rect = mClearDrawable.getBounds();
                //获取删除图标的高度
                int height = rect.height();
                int y = (int) event.getY();
                //计算图标底部到控件底部的距离
                int distance = (getHeight() - height) / 2;
                //判断触摸点是否在竖直范围内(可能会有点误差)
                //触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
                boolean isInnerHeight = (y > distance) && (y < (distance + height));
                if (isInnerHeight && isInnerWidth) {
                    this.setText("");
                }
            }
            return super.onTouchEvent(event);
        }
    
        /**
         * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
         *
         * @param visible
         */
        private void setClearIconVisible(boolean visible) {
            Drawable right = visible ? mClearDrawable : null;
            setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1],
                    right, getCompoundDrawables()[3]);
        }
    
        /**
         * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
         */
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            this.hasFocus = hasFocus;
            if (hasFocus) {
                setClearIconVisible(getText().length() > 0);
            } else {
                setClearIconVisible(false);
            }
        }
    
        /**
         * 当输入框里面内容发生变化的时候回调的方法
         */
        @Override
        public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
            if (hasFocus) {
                setClearIconVisible(text.length() > 0);
            }
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
    
        @Override
        public void afterTextChanged(Editable s) {
    
        }
    
        /**
         * 设置晃动动画
         */
        public void setShakeAnimation() {
            this.startAnimation(shakeAnimation(5));
        }
    
        /**
         * 晃动动画
         *
         * @param counts 1秒钟晃动多少下
         * @return
         */
        public static Animation shakeAnimation(int counts) {
            Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
            translateAnimation.setInterpolator(new CycleInterpolator(counts));
            translateAnimation.setDuration(1000);
            return translateAnimation;
        }
    }
    • setClearIconVisible() 方法,设置隐藏和显示清除图标的方法,这里不是调用setVisibility()方法,setVisibility()这个方法是针对View的, 我们可以调用setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)来设置上下左右的图标
    • setOnFocusChangeListener(this) 为输入框设置焦点改变监听,如果输入框有焦点,我们判断输入框的值是否为空,为空就隐藏清除图标,否则就显示
    • addTextChangedListener(this) 为 输入框设置内容改变监听,其实很简单呢,当输入框里面的内容发生改变的时候,我们需要处理显示和隐藏清除小图标,里面的内容长度不为0我们就显示,否是就 隐藏,但这个需要输入框有焦点我们才改变显示或者隐藏,为什么要需要焦点,比如我们一个登陆界面,我们保存了用户名和密码,在登陆界面 onCreate()的时候,我们把我们保存的密码显示在用户名输入框和密码输入框里面,输入框里面内容发生改变,导致用户名输入框和密码输入框里面的清 除小图标都显示了,这显然不是我们想要的效果,所以加了一个是否有焦点的判断
    • setShakeAnimation(),这个方法是输入框左右抖动的方法,当用户名错误,输入框就在哪里抖动,其实主要是用到一个移动动画,然后设置动画的变化率为正弦曲线

    接下来我们来使用它,Activity的布局,两个我们自定义的输入框,一个按钮

    <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:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:background="#95CAE4"
        tools:context=".MainActivity">
    
        <com.tony.clearedittext.ClearEditText
            android:id="@+id/username"
            android:layout_marginTop="60dp"
            android:background="@drawable/login_edittext_bg"
            android:drawableLeft="@drawable/icon_user"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:singleLine="true"
            android:drawableRight="@drawable/delete_selector"
            android:hint="输入用户名"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    
        <com.tony.clearedittext.ClearEditText
            android:id="@+id/password"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:layout_marginTop="10dip"
            android:drawableLeft="@drawable/account_icon"
            android:hint="输入密码"
            android:singleLine="true"
            android:password="true"
            android:drawableRight="@drawable/delete_selector"
            android:layout_below="@+id/username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/login_edittext_bg"
            />
    
        <Button
            android:id="@+id/login"
            android:layout_marginLeft="10dip"
            android:layout_marginRight="10dip"
            android:background="@drawable/login_button_bg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="18sp"
            android:textColor="@android:color/white"
            android:layout_below="@+id/password"
            android:layout_marginTop="25dp"
            android:text="登录"
            />
    </RelativeLayout>

    然后就是界面代码的编写,主要是测试输入框左右晃动

    package com.tony.clearedittext;
    
    import android.app.Activity;
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    
    public class MainActivity extends Activity {
    
        private Toast mToast;
        private Button mButton;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            final ClearEditText username = (ClearEditText) findViewById(R.id.username);
            final ClearEditText password = (ClearEditText) findViewById(R.id.password);
            mButton = (Button) findViewById(R.id.login);
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (TextUtils.isEmpty(username.getText())){
                        //设置晃动
                        username.setShakeAnimation();
                        //设置提示
                        showToast("用户名不能为空!");
                        return;
                    }
                    if (TextUtils.isEmpty(password.getText())){
                        password.setShakeAnimation();
                        showToast("密码不能为空!");
                        return;
                    }
                }
            });
        }
        /**
         * 显示Toast消息
         * @param msg
         */
        private void showToast(String msg) {
            if (mToast == null){
                mToast = Toast.makeText(this,msg,Toast.LENGTH_SHORT);
            }else{
                mToast.setText(msg);
            }
            mToast.show();
        }
    }

    效果图如下:

    项目源码下载地址:https://github.com/tonycheng93/Android-CustomLoginDemo

    展开全文
  • Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件。 本文就详细讲述这一过程。虽然这样的View的组合有一个粒度的问题。粒度太大了无法复用,粒度太小了又 达不...

    在Android的开发中,为了能够服用代码,会把有一定共有特点的控件组合在一起定义成一个自定义组合控件。 
    本文就详细讲述这一过程。虽然这样的View的组合有一个粒度的问题。粒度太大了无法复用,粒度太小了又 
    达不到很好的复用的效果。不过,这些不在本文的讨论范围,需要读者自己去开发的实践中体会。

    实例项目就选择一个登录注册的组件,这组件包括用户名、密码的文本输入框,还有登录和注册的按钮。这里 
    主要是为了讲解的需要,在选择服用代码的力度上可以不用参考。 
    默认的当一个新的项目创建以后就会生成一个Activity和与之相应的一个布局文件。这些已经足够使用。 
    这里假设你默认生成的Activity名称为MainActivity,布局文件为activity_main.xml。

    首先,创建一个以LinearLayout为基类的View。这个View的名字就叫做LoginView。

    /**
     * Created by Bruce on 31/10/15.
     */
    public class LoginView extends LinearLayout {
    
        private Context _context;
    
        public LoginView(Context context) {
            this(context, null);
        }
    
        public LoginView(Context context, AttributeSet attrs) {
            super(context, attrs);
            _context = context;
    
            //...
        }
    }

    代码中包含了一个Context的成员,因为我们在后面需要用到。 

    之后,创建这个View需要的布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">
    
        <EditText android:id="@+id/userName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="User name" />
    
        <EditText android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Password" />
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <Button android:id="@+id/loginButton"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Login" />
    
            <Button android:id="@+id/signupButton"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Sign Up" />
        </LinearLayout>
    
    
    </LinearLayout>

    按照前文所述,我们要做的是一个登录的界面包含用户名、密码和登录、注册按钮,一共四个子组件。在布局登录、 
    注册按钮的是时候,需要在横向布局。所以,单独使用了一个新的LinearLayout,设定这个layout的方向(orientation) 
    为横向(horizental)。两个按钮的宽度都设定为0dp,因为有layout_weight。给layout_weight分别设定了1 
    之后,这两个按钮将平分他们所在的Linearlayout的宽度。

    把这个控件使用在MainActivity中。按照惯例在activity_main中添加控件。只不过这次需要使用的全名称 
    的限定。就是需要把这个View的完整包路径全部写出来:

    <?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:orientation="vertical"
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">
    
        <com.example.home.draganddraw.LoginView
            android:id="@+id/loginView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </com.example.home.draganddraw.LoginView>
    
        <!-- 其他省略 -->
    
    </LinearLayout>
    

    com.example.home.draganddraw.LoginView就是这个View的全名称。同时我们给这个LoginView指定 
    了id为loginView。在MainActivity的java文件中可以取到这个View:

    LoginView loginView = (LoginView)findViewById(R.id.loginView);

    这个时候可以run起来这个项目。but,这样又有什么卵用呢?点个按钮也没什么反应。是的,我们需要给这个组合控件 
    添加代码。我们需要从布局文件中解析出这些单独的控件,EditText和Button。就像是在Activity中经常做的 
    那样:

    View view = LayoutInflater.from(context).inflate(R.layout.view_login, this, true);
    EditText userName = (EditText) view.findViewById(R.id.userName);
    EditText password = (EditText) view.findViewById(R.id.password);
    Button loginButton = (Button) view.findViewById(R.id.loginButton);
    Button signupButton = (Button) view.findViewById(R.id.signupButton);

    给按钮设置Click Listener。首先让按钮能有反应。那么需要一个OnClickListener。我们这里只有 
    两个按钮,所以只要在类的级别设定出监听器就可以:

    /**
     * Created by Bruce on 31/10/15.
     */
    public class LoginView extends LinearLayout implements View.OnClickListener {
    
        //...
    
        public LoginView(Context context, AttributeSet attrs) {
            super(context, attrs);
            _context = context;
    
            View view = LayoutInflater.from(context).inflate(R.layout.view_login, this, true);
            EditText userName = (EditText) view.findViewById(R.id.userName);
            EditText password = (EditText) view.findViewById(R.id.password);
            Button loginButton = (Button) view.findViewById(R.id.loginButton);
            Button signupButton = (Button) view.findViewById(R.id.signupButton);
    
            loginButton.setOnClickListener(this);
            signupButton.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.loginButton) {
                Toast.makeText(MainActivity.this, "Login", Toast.LENGTH_LONG).show();
            } else if (v.getId() == R.id.signupButton) {
                Toast.makeText(MainActivity.this, "Register", Toast.LENGTH_LONG).show();
            }
        }
    
        //...
    }
    

    用户在点击了按钮之后就会弹出一个Toast来显示你点击的是哪个按钮,“Login”和“Register”。好了,终于有 
    反映了,但是还是不够的。用户对这个View的操作需要交给Activity做特定的处理,而不是我们直接就把这些 
    功能在View里全部处理。这样,怎么能打到复用代码的目的呢?所以,我们需要把按钮的点击事件交给MainActivity 
    来处理。

    在iOS里,就是在控件中定义一个Delegate(java的interface),然后在Controller(Activity)中实现 
    并在组合控件中调用这个实现。一般来说,上面代码中public class LoginView extends LinearLayout implements View.OnClickListener 
    和方法public void onClick(View v)然后signupButton.setOnClickListener(this);就是这么一个意思。 
    只不过我们只能看到是怎么用的,但是也可以猜到是怎么定义这个interface的。以上可以总结为:

    1. 控件中定义接口。
    2. 在Activity的实现。
    3. 在控件中使用activity的实现。

    定义接口:

        /**
        * Created by Bruce on 31/10/15.
        */
        public class LoginView extends LinearLayout implements View.OnClickListener {
            private Context _context;
    
            //...
    
            @Override
            public void onClick(View v) {
                //...
            }
    
            public void setOnLoginViewClickListener(OnLoginViewClickListener loginViewClickListener) {
                //...
            }
    
            public interface OnLoginViewClickListener {
                void loginViewButtonClicked(View v);
            }
        }

    这里我们定义了接口public interface OnLoginViewClickListener还有这么一个方法void loginViewButtonClicked(View v);。 
    然后定义了这个接口的setter,是啊,activity的实现我们要怎么使用呢?就是通过这个setter给组合控件赋值 
    过来,然后使用的嘛。

    下面在activity中实现这个接口(这个在java里比在ObjC里简单多了好吗):

    public class MainActivity extends AppCompatActivity {
    
        private LoginView _loginView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            _loginView = (LoginView)findViewById(R.id.loginView);
            _loginView.setOnLoginViewClickListener(new LoginView.OnLoginViewClickListener() {
                @Override
                public void loginViewButtonClicked(View v) {
                    if (v.getId() == R.id.loginButton) {
                        Toast.makeText(MainActivity.this, "Login", Toast.LENGTH_LONG).show();
                    } else if (v.getId() == R.id.signupButton) {
                        Toast.makeText(MainActivity.this, "Register", Toast.LENGTH_LONG).show();
                    }
                }
            });
        }
    }

    实现这个接口的时候,直接在LoginView的实现上把接口new出来一个实例就可以。这个东西在ObjC里墨迹的半死。 
    现在还有人说java实现个回调太麻烦,这个有OC复杂吗?

    要在LoginView中使用这个接口的实现就更加简单了。直接上代码:

    /**
     * Created by Bruce on 31/10/15.
     */
    public class LoginView extends LinearLayout implements View.OnClickListener {
    
        private Context _context;
        private OnLoginViewClickListener _onLoginViewClickListener;
    
        //...
    
        @Override
        public void onClick(View v) {
            if (_onLoginViewClickListener != null) {
                _onLoginViewClickListener.loginViewButtonClicked(v);
            }
        }
    
        public void setOnLoginViewClickListener(OnLoginViewClickListener loginViewClickListener) {
            _onLoginViewClickListener = loginViewClickListener;
        }
    
        public interface OnLoginViewClickListener {
            void loginViewButtonClicked(View v);
        }
    }
    

    在LoginView中定义接口的成员private OnLoginViewClickListener _onLoginViewClickListener;。 
    在setter中把这个接口的实现赋值给这个LoginView的成员变量,完事儿:

    public void setOnLoginViewClickListener(OnLoginViewClickListener loginViewClickListener) {
        _onLoginViewClickListener = loginViewClickListener;
    }

    这个时候再次运行项目,点击按钮之后出现的Toast就是我们在activity里的实现了。

    到这里,这个组合控件就已经有一定的使用价值了。定义了一个接口,这个接口的实现也在activity里定义了出来。 
    把这个控件放在任何一个需要登录的actvity里都可以把用户点击按钮之后的操作给activity实现,想怎么实现 
    都可以。

    但是,我们现在需要把这个控件的用户名和密码的输入框的hint也放在外面去实现。这个需求并不复杂。既然接口的 
    实现可以在setter里实现,那么hint当然也是可以的。没错,但是这并不符合android的实现要求–什么都在 
    xml文件中定义。这样也更加便于管理。同事也方便添加,直接在LoginView的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:orientation="vertical"
        android:fitsSystemWindows="true"
        tools:context=".MainActivity">
    
        <!--<include layout="@layout/content_main" />-->
        <com.example.home.draganddraw.LoginView
            android:id="@+id/loginView"
            app:UserNameHint="yo bro"
            app:PasswordHint="hey wsp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </com.example.home.draganddraw.LoginView>
    
    </LinearLayout>

    属性app:UserNameHint="yo bro"app:PasswordHint="hey wsp"就是我们自定义的属性。 
    直接像系统内置的属性使用一样就可以。这样比隐藏在代码中的setter方便了很多。

    添加,在values文件夹下添加attrs.xml文件。然后在文件中添加:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="LoginView">
            <attr name="UserNameHint" format="string"/>
            <attr name="PasswordHint" format="string"/>
        </declare-styleable>
    </resources>

    我们要给LoginView两个属性,一个是UserNameHint一个是PasswordHint。后面的format是这个属性 
    的格式,这里都是string。

    定义了属性,写在xml文件里还是不管用的。需要我们在自定义的view里添加代码才行。代码:

    public LoginView(Context context, AttributeSet attrs) {
        super(context, attrs);
            _context = context;
    
            TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.LoginView, defStyle, 0);
            CharSequence userNameHint = typedArray.getText(R.styleable.LoginView_UserNameHint);
            CharSequence passwordHint = typedArray.getText(R.styleable.LoginView_PasswordHint);
    
            View view = LayoutInflater.from(context).inflate(R.layout.view_login, this, true);
            EditText userName = (EditText) view.findViewById(R.id.userName);
            EditText password = (EditText) view.findViewById(R.id.password);
            Button loginButton = (Button) view.findViewById(R.id.loginButton);
            Button signupButton = (Button) view.findViewById(R.id.signupButton);
    
            userName.setHint(userNameHint);
            password.setHint(passwordHint);
            loginButton.setOnClickListener(this);
            signupButton.setOnClickListener(this);
    }

    TypedArray来完成解析和取值的工作。之后给EditText分别设定hint。

    再次运行项目就可以看到你设定的hint出现了。但是,有一个错误。是的有错误。TypedArray需要回收 
    所以取到所需要的值以后,typedArray.recycle();回收TypedArray实例。

    展开全文
  • 常用控件代码 参考文章《第一行代码》 /* gravity 作用:指定文本的对齐方式 gravity 参数:top buttom left right center 可多个结合: top|left center_vertical|horizontal_center 相当于 center ...
    参考文章《第一行代码》
    
    
    /*
    
        gravity 作用:指定文本的对齐方式
        gravity 参数:top buttom left right center
    
        可多个结合:  top|left  center_vertical|horizontal_center 
        相当于 center
      	maxLines 设定最大行数
      	在EditText(文本输入框)中使用当用户输入数据超过行时向上滚动
        不会继续拉长
    */
    	<EditText
            android:layout_marginTop="20dp"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            android:hint="账号/手机号码/QQ邮箱"
            android:maxLines="2"/>
    

    在这里插入图片描述

    ImageView
    imageView.setImageResource(R.drawable.girl);将原来imageView显示
    的照片更换
      
    
    
    public class MainActivity extends AppCompatActivity implements 
    View.OnClickListener {
    
        private EditText inputText;
        private ImageView imageView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.textview_layout);
    
            inputText = (EditText) findViewById(R.id.editText);
            Button button      = (Button)findViewById(R.id.button);
            imageView          = (ImageView) findViewById(R.id.image);
    
            button.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View v) {
    
            if(v.getId() == R.id.button){
    
    			/*
    			  将原来imageView显示的照片更换
    			*/
                imageView.setImageResource(R.drawable.girl);
            }
        }
    
    
    }
    
    

    效果
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 布局: ...控件: TextView–显示文本 EditText–输入框 Button–按钮 CheckBox–单选框 RadioGroup–多选框组 RadioButton–多选框组里面单个按钮 ImageView–显示图片 7.Progressbar–进度条 ...
  • FloatingActionButton 1. 使用FloatingActionButton的情形 FAB代表一个App或一个页面中最主要的操作,如果一个App的每个...使用的时候需要导入desgin包,Android Studio 新版本都已经自动导入了,这里就不多说 co...
  • 输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的。AutoCompleteTextView控件继承自TextView控件,也有其特有的属性: ...
  • Android Studio 在xml文件中设置界面布局1、xml文件中给输入框editText修改下划线颜色2、设置button按钮为圆角及修改按钮颜色3、运用约束布局时预览效果和运行效果不一致 写一写今天困扰我很久的问题:如何给...
  • AndroidStudio之ButterKnife

    2016-12-01 18:55:02
    首先来个插件,butterknife,有了它,不必再用findViewById查找控件了。点击File——>Settings点击Plugins,输入框输入butterknife选第一个点击下载重启配置如下,首先是app下的build.gradleapply plugin: '...
  • Android Studio简易进制转换计算器 1、问题描述。 设计并实现一个数制转换器,能够对输入的任- -进制类型的数值转换为指定的数制类型的数值。必须实现的数制类型有二进制、八进制、十进制和十六进制四种。 2、基本...
  • 思路下面我们玩点复杂的:设计一个登录页面。这个登录页面大体上是...文本输入控件和按钮控件都可以把高度设置为“wrap_content”,这样它们的高就由其文本的字体大小决定,这个值不会太大。图像控件的大小也由内容...
  • 最近在搞一个项目,不想用以前的findViewById来获取控件了。使用个方便代码书写且使代码简洁的插件来得到控件,此插件就是ButterKnife。 一、点击左上角File--Settings--Plugins 然后在输入框输入Zelezny点击下载,...
  • 一、控件获取焦点 1 2 mText.setText("gfgss"); mText.setFocusable(true); xml里面输入框设置默认获取焦点 1 2 3 4 5 AutoCompleteTextView android:layout_widt
  • 一:获取布局控件 权限 二:记住密码与自动登录 mMobile.setText(sp.getString("mMobile","")); mPassword.setText(sp.getString("mPassword","")); 三:登录 1.创建...
  • 首先建立LinearLayout线性布局,然后设计垂直和水平排列,然后居中,在里面建立一个TextView控件来写标题,设计字体大小和颜色。 2.图标 和上面一样,建立LinearLayout线性布局,然后居中,在里面放ImageView控件...
  • 本人也是初出茅庐的Android新手,首次换用Android Studio进行开发,如有纰漏之处,欢迎诸位指正!控件是界面中必不可少的元素,包括常用的文本框,输入框,按钮,图片按钮,图片,单选框,复选框,进度条,拖动条等...
  • Android | IntelligentHealth

    2018-11-04 18:27:44
    熟悉Android Studio开发工具操作; 熟悉Android Studio基本UI开发,并进行UI基本设计。 二、实现内容 实现一个Andriod应用,界面呈现如图中的效果。 要求: 该界面为应用启动后看到的第一个界面; 各控件的要求 ...
  • 什么是动态自动匹配输入内容呢?举个例子,当我们在百度等搜索引擎的输入框中输入想要搜索的关键词,输入框下面会提示很...首先,我们先在res文件夹(我用的是AndroidStudio)下的active_main.xml下面加入AutoComplete
  • MaterialSearchView 类别: 文字输入框 (EditText) ...开发环境: Android Studio 浏览: 1164 次 下载: 219 次 项目地址: https://github.com/MiguelCatalan/MaterialSear...
  • android studio // 基础依赖包,必须要依赖 implementation 'com.gyf.immersionbar:immersionbar:3.0.0' // fragment快速实现(可选) implementation 'com.gyf.immersionbar:immersionbar-components:3.0.0' // ...
  • Android Studio 界面布局之xml文件中给输入框editText修改下划线颜色 / 为按钮设置圆角和颜色 / 约束布局预览效果和运行效果不一致 问题的解决 Android移动开发-调用摄像头进行拍照的实现 Android的Menu...
  • ButterKnife在Android项目中是一个很好的插件,不需要繁琐的去实例化每个控件,直接通过此插件实例化,还... 一、 首先AndroidStudio下载安装此插件:  File>>Settings>>找到Plugins选项>>右侧输入框中搜索ButterK
  • 学习平台:Android Studio2.2.3(基于win8.1 Pro) ADT:Nexus5 API:24 参考书籍:《第一行代码》2th edition 有关章节:3.2 常用控件的使用方法。关于hint提示,郭老师的第一版书使用的是EditText的hint,默认有浅色...
  • 这时候,就可以去AndroidStudio右侧边栏,点开Gradle工具条,然后找到app底下的AndroidDependencies,双击运行之后,就可以去控制台查看你这个项目到底依赖了多少个jar包。 学习Gradle,道阻且长,不过对于目前这个...
  • mini-gesture-lock - 微信小程序手势解锁(无Android Canvas卡顿问题) weapp.socket.io - socket.io 风格的 websocket 类库 weapp-polyfill - [w3c 标准 API polyfill wx-promise-pro ★666+ - 微信小程序 Promise...

空空如也

空空如也

1 2
收藏数 29
精华内容 11
关键字:

androidstudio输入框控件