PinViewという名前のカスタムビューをRelativeLayoutから拡張しました。 コンストラクタでは、私は自分のinit()メソッドを呼び出し、レイアウトからビューを展開します。カスタムビューが初期化されているうちにカスタムビューにビューを展開できないのはなぜですか?
inflate(getContext(), R.layout.layout_pin_view, this);
このフローを実行した後、私は他のビュー(Imageview)をこのビューに追加する必要があります(addView()をリクエストしてください)。そして、スロー:
catch (NoSuchMethodException e) {
InflateException ie = new InflateException(attrs.getPositionDescription()
+ ": Error inflating class "
+ (prefix != null ? (prefix + name) : name));
ie.initCause(e);
throw ie;
を私はsuccessly膨らませることができます。
mLlPins.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
mLlPins.getViewTreeObserver().removeOnGlobalLayoutListener(this);
....
....
addView(...)
}
});
あなたは私たちが同期で膨らませると、ダイナミックビューを作成傾ける理由のアイデアを持っていますか?
私のコード部分:
私の理解でprivate void init() {
View view = inflate(getContext(), R.layout.layout_pin_view, this);
mEtPin = (PinEditText) view.findViewById(R.id.etPin);
mLlPins = (LinearLayout) view.findViewById(R.id.llPins);
mEtPin.setVisibility(View.VISIBLE);
mEtPin.setFilters(new InputFilter[]{new InputFilter.LengthFilter(mMaxLength)});
mEtPin.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return false;
}
});
mEtPin.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) {
if (mImageViews != null) {
for (int i = 0; i < mImageViews.length; i++)
mImageViews[i].setEnabled(i < s.length());
if (s.length() == mMaxLength) {
InputMethodManager imm = (InputMethodManager) mEtPin.getContext().getSystemService(
Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEtPin.getWindowToken(), 0);
}
}
}
});
mLlPins.setClickable(false);
mEtPin.setText(mEtPin.getText());
mEtPin.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) {
if (mImageViews == null) return;
for (int i = 0; i < mMaxLength; i++) {
if (mImageViews[i] != null) {
if (i < s.length()) {
mImageViews[i].setImageAlpha(255);
continue;
}
}
mImageViews[i].setImageAlpha(0);
}
}
});
setMaxLength(4);
}
private void setMaxLength(int maxLength) {
LayoutInflater inflater = LayoutInflater.from(mLlPins.getContext());
mMaxLength = maxLength;
mEtPin.setFilters(new InputFilter[]{new InputFilter.LengthFilter(maxLength)});
mImageViews = new ImageView[maxLength];
mLlPins.removeAllViews();
int totalContentLenght = mLlPins.getMeasuredWidth() - dpToPx((maxLength - 1) * mMargin);
int itemWidthHeight = totalContentLenght/maxLength;
int itemMargin = dpToPx(mMargin/2);
int itemPadding = (int) (itemWidthHeight * srcRatio);
for (int i = 0; i < maxLength; i++) {
mImageViews[i] = (ImageView) inflater.inflate(mPinImage, null);
mImageViews[i].setEnabled(false);
mImageViews[i].setPadding(itemPadding, itemPadding, itemPadding, itemPadding);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(itemWidthHeight, itemWidthHeight);
if (i == 0) {
params.setMargins(0, 0, itemMargin, 0);
} else if (i < maxLength - 1) {
params.setMargins(itemMargin, 0, itemMargin, 0);
} else {
params.setMargins(itemMargin, 0, 0, 0);
}
mImageViews[i].setImageAlpha(0);
mLlPins.addView(mImageViews[i], params);
}
}
'あなたのコンストラクタを投稿してくださいは、init()'メソッド、およびスタックトレースを捕まった「例外」から。 –
ああ!それは私のせいです。ログを取得しようとしているときに問題が見つかりました。アクティビティでは、作成後、このアクティビティはいくつかのコントロールによって閉じられます。このプロセスをデバッグすると、私が書いたようにエラーがスローされます。私はこの質問を閉じる必要があります。また、ビューのサイズを取得するためにgloballayoutlistenerを使用する必要があります:) – atasoyh