当前位置:编程学习 > wap >>

EditText怎么改变输入密码字符的等待时间

客户感觉输入密码字符的等待时间太长了 要将时间变短 怎么可以缩短等待时间
--------------------编程问答-------------------- 这个可能就要修改framework了,重新编译一遍,放到你的android系统里替代原来的 --------------------编程问答-------------------- 这个到没弄过!呵呵,帮顶下! --------------------编程问答-------------------- 楼主可以看看TextView.setTransformationMethod(TransformationMethod) 方法
显示密码应该使用的TransformationMethod是android.text.method.PasswordTransformationMethod
--------------------编程问答-------------------- 可以试试自己实现一个TransformationMethod类
通过调用TextView.setTransformationMethod,来代替系统PasswordTransformationMethod --------------------编程问答--------------------
引用 1 楼 lieri111 的回复:
这个可能就要修改framework了,重新编译一遍,放到你的android系统里替代原来的

请问framework 怎么修改? --------------------编程问答--------------------
引用 4 楼 ffyd2000 的回复:
可以试试自己实现一个TransformationMethod类
通过调用TextView.setTransformationMethod,来代替系统PasswordTransformationMethod

我要的不是显示 是改变等待时间 客户要求不要那里长时间 --------------------编程问答-------------------- 自己写一个吧 监听按键按下 把收到键值的缓存起来 把*显示出去 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 6 楼 coco163 的回复:
引用 4 楼 ffyd2000 的回复:
可以试试自己实现一个TransformationMethod类
通过调用TextView.setTransformationMethod,来代替系统PasswordTransformationMethod

我要的不是显示 是改变等待时间 客户要求不要那里长时间

楼主可以看看PasswordTransformationMethod的源代码,貌似那个延时就是在PasswordTransformationMethod里面做的 --------------------编程问答--------------------
引用 7 楼 fontlose 的回复:
自己写一个吧 监听按键按下 把收到键值的缓存起来 把*显示出去

我不是要他显示不出来 只是想等待时间变得短一点 --------------------编程问答--------------------
引用 10 楼 ffyd2000 的回复:
引用 6 楼 coco163 的回复:

引用 4 楼 ffyd2000 的回复:
可以试试自己实现一个TransformationMethod类
通过调用TextView.setTransformationMethod,来代替系统PasswordTransformationMethod

我要的不是显示 是改变等待时间 客户要求不要那里长时间

楼主可以看看PasswordTra……


我在PasswordTransformationMethod 看到这样的一段代码 


private static class Visible
    extends Handler
    implements UpdateLayout, Runnable
    {
        public Visible(Spannable sp, PasswordTransformationMethod ptm) {
            mText = sp;
            mTransformer = ptm;
            postAtTime(this, SystemClock.uptimeMillis() + 1500);
        }

        public void run() {
            mText.removeSpan(this);
        }

        private Spannable mText;
        private PasswordTransformationMethod mTransformer;
    }
是继承并覆写这个方法吗? --------------------编程问答-------------------- 显示密码应该使用的TransformationMethod是android.text.method.PasswordTransformationMethod 
 
 
--------------------编程问答--------------------      谢谢楼上和楼主的提醒。自己用了最笨的方法,将源码复制后修改了下,并定义一个新类MPasswordTransformationMethod。
      然后可以直接钓用TextView.setsetTransformationMethod(MPasswordTransformationMethod.getInstance())
/*
 * 修改PasswordTransformationMethod源码
 * 
 */

import android.os.Handler;
import android.os.SystemClock;
import android.graphics.Rect;
import android.view.View;
import android.text.Editable;
import android.text.GetChars;
import android.text.NoCopySpan;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.Spanned;
import android.text.Spannable;
import android.text.method.TransformationMethod;
import android.text.style.UpdateLayout;

import java.lang.ref.WeakReference;

public class MPasswordTransformationMethod
implements TransformationMethod, TextWatcher
{
//笨方法,从别的包引用的静态常量直接在类里定义
private static final Object TextKeyListener_ACTIVE = new NoCopySpan.Concrete(); 

    public CharSequence getTransformation(CharSequence source, View view) {
        if (source instanceof Spannable) {
            Spannable sp = (Spannable) source;

            /**
             * Remove any references to other views that may still be
             * attached.  This will happen when you flip the screen
             * while a password field is showing; there will still
             * be references to the old EditText in the text.
             */
            ViewReference[] vr = sp.getSpans(0, sp.length(),
                                             ViewReference.class);
            for (int i = 0; i < vr.length; i++) {
                sp.removeSpan(vr[i]);
            }

            removeVisibleSpans(sp);

            sp.setSpan(new ViewReference(view), 0, 0,
                       Spannable.SPAN_POINT_POINT);
        }

        return new PasswordCharSequence(source);
    }

    public static MPasswordTransformationMethod getInstance() {
        if (sInstance != null)
            return sInstance;

        sInstance = new MPasswordTransformationMethod();
        return sInstance;
    }

    public void beforeTextChanged(CharSequence s, int start,
                                  int count, int after) {
        // This callback isn't used.
    }

    public void onTextChanged(CharSequence s, int start,
                              int before, int count) {
        if (s instanceof Spannable) {
            Spannable sp = (Spannable) s;
            ViewReference[] vr = sp.getSpans(0, s.length(),
                                             ViewReference.class);
            if (vr.length == 0) {
                return;
            }

            /**
             * There should generally only be one ViewReference in the text,
             * but make sure to look through all of them if necessary in case
             * something strange is going on.  (We might still end up with
             * multiple ViewReferences if someone moves text from one password
             * field to another.)
             */
            View v = null;
            for (int i = 0; v == null && i < vr.length; i++) {
                v = vr[i].get();
            }

            if (v == null) {
                return;
            }

//            int pref = TextKeyListener.getInstance().getPrefs(v.getContext()); //注释
//            if ((pref & TextKeyListener.SHOW_PASSWORD) != 0) { //注释
            if (true) { //将if的条件改为true
                if (count > 0) {
                    removeVisibleSpans(sp);
                    
                    if (count == 1) {
                        sp.setSpan(new Visible(sp, this), start, start + count,
                                   Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                    }
                }
            }
        }
    }

    public void afterTextChanged(Editable s) {
        // This callback isn't used.
    }

    public void onFocusChanged(View view, CharSequence sourceText,
                               boolean focused, int direction,
                               Rect previouslyFocusedRect) {
        if (!focused) {
            if (sourceText instanceof Spannable) {
                Spannable sp = (Spannable) sourceText;

                removeVisibleSpans(sp);
            }
        }
    }

    private static void removeVisibleSpans(Spannable sp) {
        Visible[] old = sp.getSpans(0, sp.length(), Visible.class);
        for (int i = 0; i < old.length; i++) {
            sp.removeSpan(old[i]);
        }
    }

    private static class PasswordCharSequence
    implements CharSequence, GetChars
    {
        public PasswordCharSequence(CharSequence source) {
            mSource = source;
        }

        public int length() {
            return mSource.length();
        }

        public char charAt(int i) {
            if (mSource instanceof Spanned) {
                Spanned sp = (Spanned) mSource;

                int st = sp.getSpanStart(TextKeyListener_ACTIVE);
                int en = sp.getSpanEnd(TextKeyListener_ACTIVE);

                if (i >= st && i < en) {
                    return mSource.charAt(i);
                }

                Visible[] visible = sp.getSpans(0, sp.length(), Visible.class);

                for (int a = 0; a < visible.length; a++) {
                    if (sp.getSpanStart(visible[a].mTransformer) >= 0) {
                        st = sp.getSpanStart(visible[a]);
                        en = sp.getSpanEnd(visible[a]);

                        if (i >= st && i < en) {
                            return mSource.charAt(i);
                        }
                    }
                }
            }
            return DOT;
        }

        public CharSequence subSequence(int start, int end) {
            char[] buf = new char[end - start];

            getChars(start, end, buf, 0);
            return new String(buf);
        }

        public String toString() {
            return subSequence(0, length()).toString();
        }

        public void getChars(int start, int end, char[] dest, int off) {
            TextUtils.getChars(mSource, start, end, dest, off);
            
            int st = -1, en = -1;
            int nvisible = 0;
            int[] starts = null, ends = null;

            if (mSource instanceof Spanned) {
                Spanned sp = (Spanned) mSource;

                st = sp.getSpanStart(TextKeyListener_ACTIVE);
                en = sp.getSpanEnd(TextKeyListener_ACTIVE);

                Visible[] visible = sp.getSpans(0, sp.length(), Visible.class);
                nvisible = visible.length;
                starts = new int[nvisible];
                ends = new int[nvisible];

                for (int i = 0; i < nvisible; i++) {
                    if (sp.getSpanStart(visible[i].mTransformer) >= 0) {
                        starts[i] = sp.getSpanStart(visible[i]);
                        ends[i] = sp.getSpanEnd(visible[i]);
                    }
                }
            }

            for (int i = start; i < end; i++) {
                if (! (i >= st && i < en)) {
                    boolean visible = false;

                    for (int a = 0; a < nvisible; a++) {
                        if (i >= starts[a] && i < ends[a]) {
                            visible = true;
                            break;
                        }
                    }

                    if (!visible) {
                        dest[i - start + off] = DOT;
                    }
                }
            }
        }
        
        private CharSequence mSource;
    }

    private static class Visible
    extends Handler
    implements UpdateLayout, Runnable
    {
        public Visible(Spannable sp, MPasswordTransformationMethod ptm) {
            mText = sp;
            mTransformer = ptm;
            /*
             * 从这里修改字符改变的等待时间
             */
            postAtTime(this, SystemClock.uptimeMillis() + 150);
        }

        public void run() {
            mText.removeSpan(this);
        }

        private Spannable mText;
        private MPasswordTransformationMethod mTransformer;
    }

    /***
     * Used to stash a reference back to the View in the Editable so we
     * can use it to check the settings.
     */
    private static class ViewReference extends WeakReference<View>
            implements NoCopySpan {
        public ViewReference(View v) {
            super(v);
        }
    }

    private static MPasswordTransformationMethod sInstance;
    private static char DOT = '\u2022';
}
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,