14

私は単純な AppCompatEditText を作成して OnFocusChangeListener を追加し、それを単純な TextInputLayout に入れています。

AppCompatEditText がフォーカスを失った場合、そのコンテンツは isValidParam メソッドによって検証される必要があります。

昨日までは rev.23.0.3 を使っていたのですが、rev.24.0.2 を使うと isValidParam メソッドの 1 行目で以下のようなエラーが出ます。

java.lang.ClassCastException: android.widget.FrameLayout は android.support.design.widget.TextInputLayout にキャストできません

デバッグモードで確認しました。AppCompatEditText.getpParent() は、実際には TextInputLayout ではなく Framelayout を返します。

LinearLayout llParams = new LinearLayout(context);
llParams.setOrientation(LinearLayout.VERTICAL);

// Create label for param
final TextInputLayout tilParam = new TextInputLayout(context);
// Add label into layout
llParams.addView(tilParam);


// Create Editor for param
final AppCompatEditText etParam = new AppCompatEditText(context);

edParam.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (!hasFocus)
            if (isValidParam(etParam)) {
                do some thing;
            } else {
                do other thing;
            }
    }
});

tilParam.addView(etParam);


// validation method
boolean isValidParam(AppCompatEditText editText) {
    TextInputLayout til = (TextInputLayout) editText.getParent();

    String text = editText.getText().toString().trim();

    if (!text.equls("some criteria") {
        till.setError("Error text")
        return false;
    }

    return true;
}
4

6 に答える 6

11

更新: TextInputLayout 内ではなく
、ウィジェットを使用してください。TextInputEditTextEditText

古い答え

TextInputLayout textInputLayout = (TextInputLayout) editText.getParent().getParent();

それはクイックフィックスとして機能するようです。理想にはほど遠い。

于 2016-08-30T14:04:07.207 に答える
9

getParentForAccessibility()私のために働いた

于 2016-12-15T06:59:59.833 に答える
2

TextInputLayoutv24.xxのコードを確認でき
ますFrameLayout

@Override
public void addView(View child, int index, final ViewGroup.LayoutParams params) {
    if (child instanceof EditText) {
        mInputFrame.addView(child, new FrameLayout.LayoutParams(params));
        //...
     } else {
        // Carry on adding the View...
        super.addView(child, index, params);
    }
}

はどこmInputFrameですかFrameLayout
それが問題の理由です (親は ですFrameLayout)。

使用する必要がある場合はtilParam、使用する代わりに as パラメータを渡すだけです。getParent()

于 2016-08-31T20:17:11.683 に答える
0

TextInputLayout には getEditText() というメソッドがあります。これは、問題を解決する別の方法かもしれません。EditText 自体から開始して親の TextInputLayout を取得する代わりに、TextInputLayout から開始して、EditText の子ビューを取得することができます。xml で生成されたビューの場合、次のコードは例です。

TextInputLayout someInputLayout = findViewById(R.id.some_input_layout);
EditText someEditText = someInputLayout.getEditText();
String text = someEditText.getText().toString();

これは、外部メソッドを必要としないため、より望ましい解決策になる可能性がありますが、何らかの理由で EditText から開始する必要がある場合、これは問題を解決しません。これはずっと前に回答されたことを知っていますが、特定の問題について上記のようにする方がよいことがわかるまで、@ sylwanoのソリューションを使用していました。

于 2019-10-09T14:38:09.743 に答える