2017-08-09 77 views
0

對於InputType textPassword,TextInputLayout中有一個密碼可見性切換按鈕。Android。 TextInputLayout。切換密碼可見性事件監聽器?

是否有可能捕捉切換事件?

我找不到這個

+1

不是。好吧,無論如何,沒有什麼可用的。這個'View'上有一個匿名的'OnClickListener',它只是調用一個包 - 私有切換方法。我可以想到幾種方法來僞造它。最簡單的方法是獲取對該View的引用,並在其上設置一個「OnTouchListener」,因爲您可以設置它以避免干擾「OnClickListener」。 –

+1

如果您可以找到訪問'mPasswordToggleView'的方法,您可以找到解決方案。 –

+0

@ K.Sopheak我認爲,也許有這個:)的正式解決方案,是的,這就是我現在正在嘗試的方式 – Tima

回答

1

我看着TextInputLayout的源代碼,找到切換按鈕的視圖的類型的任何公共方法。它的CheckableImageButton。其他一切都很簡單。您需要查找迭代迭代TextInputLayout視圖的子節點的視圖。然後將setOnTouchListener設置爲@MikeM在評論中提示。

View togglePasswordButton = findTogglePasswordButton(mTextInputLayoutView); 
if (togglePasswordButton != null) { 
    togglePasswordButton.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      // implementation 
      return false; 
     } 
    }); 
} 

private View findTogglePasswordButton(ViewGroup viewGroup) { 
    int childCount = viewGroup.getChildCount(); 
    for (int ind = 0; ind < childCount; ind++) { 
     View child = viewGroup.getChildAt(ind); 
     if (child instanceof ViewGroup) { 
      View togglePasswordButton = findTogglePasswordButton((ViewGroup) child); 
      if (togglePasswordButton != null) { 
       return togglePasswordButton; 
      } 
     } else if (child instanceof CheckableImageButton) { 
      return child; 
     } 
    } 
    return null; 
} 

findTogglePasswordButton

private View findTogglePasswordButton() { 
    return findViewById(R.id.text_input_password_toggle); 
} 

@MikeM的替代implmentation。謝謝你的ID

+1

那個'CheckableImageButton'有一個ID,顯然,如果你寧願去那條路線。名字是'text_input_password_toggle',你可以通過'Resources#getIdentifier()'方法獲得int值。只是FYI。 –

+0

@MikeM。很高興知道。想想如果他們改變了ID?! – Tima

+0

這不太可能,但是,無論哪種方式,它都是打包在應用程序中的資源,並且您可以控制支持庫版本。也就是說,只要你有編譯的庫版本的正確標識,你就很好。它不依賴於設備之間可能不同的系統資源。 –