如何隐藏和显示Android上的按钮点击密码?

如何隐藏和显示Android上的按钮点击密码?

问题描述:

当按钮按下想要看到密码,否则应该隐藏或说点。 我已应用下面的代码,但它不工作。 任何帮助,将不胜感激。如何隐藏和显示Android上的按钮点击密码?

button.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      if(button.isPressed()) { 
       upass.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD); 
       return true; 
      } 
      return true; 
     } 
    }); 
+1

http://stackoverflow.com/questions/9892617/programmatically-change-input-type -of-the-edittext-from-password-to-normal-vic – Rahul

+0

参考[如何在隐藏和查看密码之间切换](http://stackoverflow.com/questions/3685790/how-to-switch-between-hide和查看密码) –

您已经使用OnTouchListener它给你MotionEvent的。使用它们!无需再次检查按钮,只要按下它即可。MotionEvent就在那里。

要看到的密码字段与密码:inputType = TYPE_CLASS_TEXT | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

当按钮被按下MotionEvent.ACTION_UP这样你就可以看到文本。 当MotionEvent.ACTION_DOWN保持它,因为它是在开始。

button.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 

      switch (event.getAction()) { 

      case MotionEvent.ACTION_UP: 
      editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD); 
      break; 

      case MotionEvent.ACTION_DOWN: 
      editText.setInputType(InputType.TYPE_CLASS_TEXT); 
      break; 

      } 
      return true; 
      } 
      }); 
+0

谢谢,节省了我的时间... +1 –

showhide.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       global.hideKeyboard(); 

       if(showhide.getText().equals("Hide")) 
       { 
        showhide.setText("Show"); 
        etPassword.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
       } 
       else if(showhide.getText().equals("Show")) 
       { 
        showhide.setText("Hide"); 
        etPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
       } 
      } 
     }); 

增强的密码输入视图:切换密码的可见性。 嘿!我决定延迟推出博客,分享更多关于Android开发的内容。今天让我们从一个简单的开始:密码输入字段。

增强密码输入。 通常,登录或注册UI表单都有一些密码输入字段。 Android SDK提供了一种简单的方法来使用隐藏字符输入字段:EditTextinputType="textPassword"。很简单。但是,如果您需要输入一些长而复杂的密码,这可能会有些乏味:制作一个类型非常容易,然后您需要再次开始密码输入。

解决方案。 因此,为了使密码输入更容易,我们可以实现一个简单但非常有效的解决方案:在输入字段的右边缘显示一个图标,当您敲下图标时 - 当您抬起手指时,输入的密码变得可见 - 它再次显示只有模糊的字符。简单,有效和安全!

至少有三个明显的可能的方式来实现这一目标:在布局 撰写默认的Android SDK的观点,并把行为逻辑到父片段/活动 做出组成的ViewGroup封装布局和行为逻辑 做一个EditText将在视图的右侧管理自定义绘图的子类

所有这三种方式都适合您。最初我以第一种方式制作,原因如下: 我不喜欢在没有真正需要的情况下创建额外的实体。像奥卡姆的剃刀主管。 :) 我需要把它只在一个地方当然

,如果你需要有相同的增强型密码查看在不同的地方多次选择第二或第三(最好,原因视图层次是平)选项。

执行。 因此,与默认的Android SDK的观点仅可以在增强密码视图的最简单的实现看起来像这样:

  1. 在XML布局的符号(琐碎和非主题相关的PARAMS像补白省略):

    <RelativeLayout 
    ...> 
    
        <EditText 
         android:id="@+id/fragment_login_password" 
         android:inputType="textPassword" 
        .../> 
    
        <ImageView 
         android:id="@+id/fragment_login_password_visibility" 
         android:layout_alignRight="@+id/fragment_login_password" 
         android:clickable="true" 
         android:src="@drawable/ic_show_password" 
        .../> 
    </RelativeLayout> 
    
  2. 在母体片段/活动:

    2.1。为了获得良好的UX,让我们添加一个文本改变监听器显示密码能见度是否有某种类型的密码值,并隐藏空密码查看:

    mPasswordView.addTextChangedListener(new TextWatcher() { 
        @Override 
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
        } 
    
        @Override 
        public void onTextChanged(CharSequence s, int start, int before, int count) { 
        } 
    
        @Override 
        public void afterTextChanged(Editable s) { 
         mPasswordVisibilityView.setVisibility(s.length() > 0 ? View.VISIBLE : View.GONE); 
        } 
    }); 
    

    2.2。设置密码的知名度视图触摸监听器上的触摸反应

    mPasswordVisibilityView.setOnTouchListener(mPasswordVisibleTouchListener); 
    

触摸监听器应用可见字符模式下,如果手指向下知名度视图中,并应用原始密码方式回来时,手指向上或离开能见度视图。此外,我们关心持续光标位置,因此用户可以随时切换可见性模式,而不会丢失当前输入光标位置。

private View.OnTouchListener mPasswordVisibleTouchListener = new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     final boolean isOutsideView = event.getX() < 0 || 
      event.getX() > v.getWidth() || 
      event.getY() < 0 || 
      event.getY() > v.getHeight(); 

    // change input type will reset cursor position, so we want to save it 
    final int cursor = mPasswordView.getSelectionStart(); 

    if (isOutsideView || MotionEvent.ACTION_UP == event.getAction()) 
     mPasswordView.setInputType(InputType.TYPE_CLASS_TEXT | 
            InputType.TYPE_TEXT_VARIATION_PASSWORD); 
    else 
     mPasswordView.setInputType(InputType.TYPE_CLASS_TEXT | 
            InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); 

     mPasswordView.setSelection(cursor); 
     return true; 
    } 
}; 

就是这样!正如我所说的那样实施起来非常简单,但它大大提高了用户体验!

+1

谢谢你非常好的解释。但不幸的是View.OnTouchListener mPasswordVisibleTouchListener ....此代码无法正常工作。 @Anurag_Systematix –

你不应该重新发明轮子。使用它:

<android.support.design.widget.TextInputLayout 
android:id="@+id/passwordLayout" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
app:passwordToggleEnabled="true"> 

<android.support.design.widget.TextInputEditText 
    android:id="@+id/password" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:inputType="textPassword"/> 

</android.support.design.widget.TextInputLayout> 

属性app:passwordToggleEnabled显示/隐藏你想要的按钮。请注意,您还必须这个字符串添加到您的应用的build.gradle:

compile 'com.android.support:design:25.1.0' 
+0

它不工作。发生错误 - 错误:(123)未找到包'android'中属性'passwordToggleEnabled'的资源标识符。 @ Hetfieldan24 –

+0

它看起来像你用android:passwordToggleEnabled =“true”>代替app:passwordToggleEnabled =“true”。请发布您的XML文件。你把xmlns:app =“schemas.android.com/apk/res-auto”;在你的根文件中放置这个文件? – Hetfieldan24

这个工程:

button.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch(event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        upass.setTransformationMethod(HideReturnsTransformationMethod.getInstance()); 
        return true; 
       case MotionEvent.ACTION_UP: 
        upass.setTransformationMethod(PasswordTransformationMethod.getInstance()); 
        return true; 
      } 
      return false; 
     } 
    });